2010-12-26 5 views
13

Вот конкретный пример того, что я хочу сделать.Могу ли я сделать директиву препроцессора в зависимости от версии .NET framework?

Рассмотрите функцию string.Join. Pre -.NET 4.0, было только две перегрузки, каждая из которых требовала параметра string[].

Начиная с .NET 4.0 появляются новые перегрузки с использованием более гибких типов параметров, включая IEnumerable<string>.

У меня есть библиотека, которая включает в себя функцию Join, которая действительно выполняет функцию .NET 4.0 string.Join. Мне просто интересно, могу ли я реализовать реализацию этой функции в зависимости от платформы .NET. Если 4.0, он может просто вызвать string.Join внутренне. Если 3.5 или старше, он может назвать свою собственную внутреннюю реализацию.

  1. Имеет ли смысл эта идея?
  2. Если это имеет смысл, что это самый логичный способ сделать это? Я предполагаю, что я просто предполагаю, что директива препроцессора будет иметь наибольший смысл, поскольку вызов string.Join с параметром IEnumerable<string> не будет даже компиляции при ориентации на версию .NET старше 4.0; поэтому любой подход, который я использую, должен был состояться до компиляции. (Проверка Environment.Version свойства во время выполнения, например, не будет работать.)
+1

Смотрите также http://stackoverflow.com/questions/3436526/detect-target-framework-version-at-compile-time – Maslow

ответ

14

Вы можете взглянуть на другой вопрос о переполнении стека, которая иллюстрирует, как установить условные константы через XML файла проекта: Detect target framework version at compile time

После этого вы можете определить, следует ли использовать перегрузки .NET 4 или собственную библиотеку.

+0

+1; выглядит как идеальное решение –

+0

Nice, отлично работает! Спасибо за полезную ссылку. –

2

Да, я думаю, что это имеет смысл (для вашего конкретного случая, так как изменение относительно незначительное), хотя очевидно, что такая вещь может быстро выходить из-под контроля.

IMHO, наиболее логичным способом для этого было бы создание различных конфигураций решений/проектов для каждой версии, а затем определить пользовательский символ (скажем, NET40) в ваших конфигурациях 4.0, а затем использовать его с помощью #if. Я не уверен, что конфигурации позволят вам изменить версию исполнения (что, очевидно, будет идеальным решением), но в худшем случае вам придется вручную менять версию.

EDIT: Я только что видел ответ, связанный в ответе Иешуа, и это кажется более обтекаемым решением, но я оставлю это здесь в любом случае, так как это делает, строго говоря, ответить на вопрос.

+0

Я действительно думал по тем же линиям, что и вы, и решил искать вокруг, чтобы увидеть, есть ли альтернативы. –

1

Вы можете подготовить свой код для .NET 4.0 и написать аналогичный код для базы .NET 3.5 на framework detection.

#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 

И положил его в свой * .csproj

<DefineConstants Condition=" '$(TargetFrameworkVersion)' != 'v4.0' ">NOT_RUNNING_ON_4</DefineConstants>