По разным причинам я часто нахожу желательным писать код, совместимый с .NET Framework 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>
. Кстати, если вы хотите использовать 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, но недоступна из C # 3 и VB 9)
Reflection.Emit
(отсутствует в .NETCF; на самом деле это не маленькая функция, но я очень по ней скучаю)