Dot-Net

用於向後移植新的 .NET Framework 功能的“兼容包”?

  • February 18, 2015

由於各種原因,我經常發現編寫與 .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舊版本

在提到的功能中,包括以下功能:

  • ExtensionAttribute
  • Func<...>Action<...>代表
  • LINQ 到對象
  • Tuple<...>
  • Lazy<T>Lazy<T,TMetadata>
  • 表情樹

還包括問題中未提及的以下功能:

  • HashSet<T>
  • SortedSet<T>
  • ThreadLocal<T>
  • IObservable<T>IObserver<T>
  • BigInteger
  • ConcurrentDictionary<Tkey, TValue>
  • 等等…

注意:System.Threading.Tasks計劃支持。

遺憾的是,在撰寫本文時可用的文件很少,但與 BCL 的任何行為差異都可以被視為錯誤,並且可以通過 github 報告

引用自:https://stackoverflow.com/questions/3462419