По разным причинам я часто считаю желательным писать код, совместимый с .NET framework 2.0 или 3.5 или совместимый с .NET Compact Framework, но проблема в том, что в новой .NET есть множество "маленьких" функций. которые недоступны в старых рамках или Compact Framework.
Например, я считаю, что методы расширения действительно полезны, но для этого компилятор зависит от System.Runtime.CompilerServices.ExtensionAttribute
. Вы можете легко определить этот атрибут самостоятельно, а затем использовать методы расширения в .NET Framework 2.0 (в С# 3.0+). Аналогично, не так сложно вручную определить небольшие типы .NET 4, такие как Tuple<T1,T2>
и Lazy<T>
. Кстати, если вы хотите использовать LINQ в .NET 2.0, вы можете использовать LinqBridge.
Теперь предположим, что вы создаете публикацию ExtensionAttribute
, чтобы другие записи, которые вы пишете, могли ее использовать. Сначала это хорошо, но что, если вы захотите использовать стороннюю библиотеку, которая также имеет ту же идею? Вы добавляете ссылку на эту библиотеку, и теперь у вас есть столкновение имен. К сожалению.
Я также заметил, что некоторые новые библиотеки доступны только для .NET 4.0 или 3.5, хотя у них есть только незначительные зависимости от них, которые могут быть решены с использованием пакета совместимости или LinqBridge.
Было бы неплохо, если бы были "пакеты совместимости" для более старых версий .NET, которые определяли эти небольшие функции в небольшой DLL, которые вы могли бы обосновать, включая проекты любого размера. Существует ли такая вещь?
Обновление. Судя по тишине, я думаю, что нет такой вещи. Я мог бы сделать такую библиотеку OSS самостоятельно, если есть интерес. Итак, мой новый вопрос: какие меньшие возможности .NET 4 (в отличие от монстров, таких как WCF/WPF) пропустили бы, если бы вы писали для .NET 2,.NET 3.5,.NETCF или Silverlight? Я запустил список...
-
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, но недоступна для С# 3 и VB 9)
-
Reflection.Emit
(отсутствует в .NETCF; на самом деле это не маленькая функция, но я очень скучаю по ней)