用於向後移植新的 .NET Framework 功能的“兼容包”?
由於各種原因,我經常發現編寫與 .NET 框架 2.0 或 3.5 兼容或與 .NET Compact Framework 兼容的程式碼是可取的,但新的 .NET 框架中有許多“小”功能是一個問題。在較舊的框架或 Compact Framework 中不可用。
例如,我發現擴展方法非常有用,但編譯器依賴
System.Runtime.CompilerServices.ExtensionAttribute於此。您可以輕鬆地自己定義此屬性,然後在 .NET Framework 2.0(在 C# 3.0+ 下)中使用擴展方法。同樣,手動定義小的 .NET 4 類型(如Tuple<T1,T2>和Lazy<T>. 順便說一句,如果你想在 .NET 2.0 中使用 LINQ,你可以使用LinqBridge。現在假設您
ExtensionAttribute公開,以便您編寫的其他程序集可以使用它。起初這很好,但如果您想使用也有相同想法的第 3 方庫怎麼辦?您添加了對該庫的引用,現在您遇到了名稱衝突。哎呀。我還注意到一些新庫僅適用於 .NET 4.0 或 3.5,即使它們對它的依賴很小,可以使用兼容包或 LinqBridge 解決。
如果有舊 .NET 版本的“兼容包”在一個小 DLL 中定義這些小功能,您可以證明包括在任何規模的項目中,那肯定會很好。這樣的事情存在嗎?
更新:從沉默來看,我想沒有這樣的事情。如果有興趣,我可能會自己製作這樣一個 OSS 庫。所以我的新問題是,如果您為 .NET 2、.NET 3.5、.NETCF 或 Silverlight 編寫程式碼,您會錯過 .NET 4(與 WCF/WPF 之類的怪物相比)的哪些*較小功能?*我將開始列出清單…
ExtensionAttribute(不在 .NET 2 中)Func<...>和Action<...>代表(不在 .NET 2 中)- LINQ-to-objects(不在 .NET 2 中)
Tuple<...>(不在 .NET 3.5 中)Lazy<T>和Lazy<T,TMetadata>(不在 .NET 3.5 中)- 表達式樹(不在 .NET 2 中;在 .NET 3.5 中不完整)
- 泛型變數(存在於 .NET 2 中,但無法從 C# 3 和 VB 9 訪問)
Reflection.Emit(從 .NETCF 中缺失;不是一個真正的小功能,但我非常想念它)
Theraot的圖書館
由於條件編譯,您可以使用 Theraot 庫中的 use 將大部分 .NET 程式碼反向移植到從 .NET 2.0 開始的
Theraot.Core舊版本。在提到的功能中,包括以下功能:
ExtensionAttributeFunc<...>和Action<...>代表- LINQ 到對象
Tuple<...>Lazy<T>和Lazy<T,TMetadata>- 表情樹
還包括問題中未提及的以下功能:
HashSet<T>SortedSet<T>ThreadLocal<T>IObservable<T>和IObserver<T>BigIntegerConcurrentDictionary<Tkey, TValue>- 等等…
注意:
System.Threading.Tasks計劃支持。遺憾的是,在撰寫本文時可用的文件很少,但與 BCL 的任何行為差異都可以被視為錯誤,並且可以通過 github 報告。