Pregunta

Aquí hay un ejemplo concreto de lo que yo quiero hacer.

Considere la función string.Join. Pre-.NET 4,0, sólo había dos sobrecargas, ambos de los cuales requieren un parámetro string[].

A partir de .NET 4.0, hay nuevas sobrecargas que toman tipos de parámetros más flexibles, incluyendo IEnumerable<string>.

Tengo una biblioteca que incluye una función Join que básicamente hace lo que hace la función de string.Join .NET 4.0. Me preguntaba si podía hacer depende de la implementación de esta función en el marco .NET como objetivo. Si 4.0, se podría llamar simplemente string.Join internamente. Si 3,5 o más, podría llamar a su propia implementación interna.

  1. ¿Esto tiene sentido idea de hacer?
  2. Si lo hace tiene sentido, ¿cuál es la forma más lógica de hacerlo? Supongo que sólo estoy asumiendo una directiva de preprocesador haría más sentido, ya que una llamada a string.Join con un parámetro IEnumerable<string> ni siquiera compilación cuando la orientación de una versión .NET mayor de 4,0; así que cualquier cosa que se acercan a su uso tendría que tener lugar antes de la compilación. (Comprobación de la propiedad Environment.Version en tiempo de ejecución, por ejemplo, no funcionaría.)
¿Fue útil?

Solución

Se puede echar un vistazo a otra pregunta sobre el desbordamiento de pila que muestra cómo establecer las constantes condicionales a través de XML del archivo de proyecto: Detectar versión del marco de destino en tiempo de compilación

A continuación, usando que pueda determinar si debe usar los .NET 4 sobrecargas o su propia biblioteca.

Otros consejos

Sí, yo creo que tiene sentido (para su caso particular, ya que el cambio es relativamente menor), aunque, obviamente, ese tipo de cosas podría escalar fuera de control con bastante rapidez.

En mi humilde opinión, la forma más lógica de hacerlo sería crear diferentes configuraciones / solución de proyecto para cada versión, a continuación, definir un símbolo personalizado (por ejemplo, NET40) en sus configuraciones 4.0, a continuación, utilizar estos fondos con un #if. No estoy seguro de si las configuraciones se permitirá cambiar la versión de tiempo de ejecución (que obviamente sería la solución perfecta), pero el peor de los casos es tener que cambiar la versión manual.

EDIT: acabo de ver la respuesta ligada a en la respuesta de Josué, y que parece una solución más racional, pero voy a dejar esto aquí de todos modos, ya que lo hace, en sentido estricto, responder a la cuestión.

Se puede preparar su código para .NET 4.0 y escribir el código similar para la base .NET 3.5 en detección marco .

#if NOT_RUNNING_ON_4
public static class GuidExtensions
{
   public static bool TryParse(this string s, out Guid result)
   {
       if (s.IsNullOrEmpty())
           return null;
       try
       {
          return new Guid(s);
       }
       catch (FormatException)
       {
          return null;
      }
   }
}
#else
    #error switch parsing to .NET 4.0
#endif

Y puso su línea a su * .csproj

<DefineConstants Condition=" '$(TargetFrameworkVersion)' != 'v4.0' ">NOT_RUNNING_ON_4</DefineConstants>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top