Por diversas razones, a menudo me parece deseable escribir código que sea compatible con .NET framework 2.0 o 3.5 o compatible con .NET Compact Framework, pero es un problema que haya numerosas características "pequeñas" en los nuevos .NET frameworks que no están disponibles en los marcos anteriores o Compact Framework."Paquete de compatibilidad" para backporting nuevas características de .NET Framework?
Por ejemplo, creo que los métodos de extensión son realmente útiles, pero el compilador depende de System.Runtime.CompilerServices.ExtensionAttribute
para esto. Puede definir fácilmente este atributo usted mismo y luego usar métodos de extensión en .NET Framework 2.0 (bajo C# 3.0+). Del mismo modo, no es demasiado difícil definir manualmente pequeños tipos de .NET 4 como Tuple<T1,T2>
y Lazy<T>
. Por cierto, si quiere usar LINQ en .NET 2.0, puede usar LinqBridge.
Supongamos ahora que hace público el ExtensionAttribute
para que otros ensambles que escriba puedan usarlo. Eso está bien al principio, pero ¿y si luego quieres usar una biblioteca de terceros que también tuviera la misma idea? Agrega una referencia a esa biblioteca y ahora tiene una colisión de nombre. Oops.
También he notado que algunas nuevas bibliotecas solo están disponibles para .NET 4.0 o 3.5, aunque solo tienen dependencias menores que podrían resolverse usando un paquete de compatibilidad o LinqBridge.
Sería bueno si hubiera "paquetes de compatibilidad" para versiones anteriores de .NET que definieran estas pequeñas características en una pequeña DLL que podría justificar incluso en proyectos de cualquier tamaño. ¿Existe tal cosa?
Actualización: A juzgar por el silencio, supongo que no existe tal cosa. Podría crear una biblioteca de OSS así si hubiera interés. Así que mi nueva pregunta es, ¿qué características de más pequeñas de .NET 4 (en comparación con monstruos como WCF/WPF) se perdería si estuviera escribiendo para .NET 2, .NET 3.5, .NETCF o Silverlight? Voy a empezar la lista de ...
ExtensionAttribute
(no en .NET 2)Func<...>
Action<...>
y delegados (no en .NET 2)- LINQ a objetos (no en. NET 2)
Tuple<...>
(no en .NET 3,5)Lazy<T>
yLazy<T,TMetadata>
(no en .NET 3.5)- árboles de expresión (no en .NET 2; incompleta en .NET 3.5)
- Varianza genérica (existe en .NET 2 pero inaccesible desde C# 3 y VB 9)
Reflection.Emit
(falta en .NETCF; no es realmente una característica pequeña, pero lo extraño mucho)
Pude compilar [dotNetLiquid] (http://dotliquidmarkup.org/) para .Net 2.0 usando Theraot's Libraries, y todas sus pruebas unitarias pasan con éxito (bueno, excepto una, pero esa falla incluso si construyo para .net 4). El uso de [LinqBridge] (http://www.albahari.com/nutshell/linqbridge.aspx) no fue suficiente ya que no admite expresiones. – anikiforov