У меня есть некоторый код, который использует методы расширения, но компилируется в .NET 2.0 с использованием компилятора в VS2008. Чтобы облегчить это, я должен был объявить ExtensionAttribute:
/// <summary>
/// ExtensionAttribute is required to define extension methods under .NET 2.0
/// </summary>
public sealed class ExtensionAttribute : Attribute
{
}
Однако теперь я хотел бы, чтобы библиотека, в которой содержится этот класс, была также компилируемой в .NET 3.0, 3.5 и 4.0 - без 'ExtensionAttribute определен в нескольких местах 'предупреждение.
Есть ли какая-либо директива времени компиляции, которую я могу использовать, чтобы включить ExtensionAttribute, только когда целевая версия платформы - .NET 2?
Связанный вопрос SO с "созданием N различных конфигураций", конечно, один из вариантов, но когда у меня была необходимость в этом, я просто добавил условные элементы DefineConstants, так что в моем Debug|x86 (например) после существующих DefineConstants для DEBUG;TRACE я добавил эти 2, проверяющие значение в TFV, которое было установлено в первой PropertyGroup файла csproj.
<DefineConstants Condition=" '$(TargetFrameworkVersion)' == 'v4.0' ">RUNNING_ON_4</DefineConstants>
<DefineConstants Condition=" '$(TargetFrameworkVersion)' != 'v4.0' ">NOT_RUNNING_ON_4</DefineConstants>
Вам не нужны оба, конечно, но это просто для примера поведения eq и ne - #else и #elif тоже отлично работают :)
class Program
{
static void Main(string[] args)
{
#if RUNNING_ON_4
Console.WriteLine("RUNNING_ON_4 was set");
#endif
#if NOT_RUNNING_ON_4
Console.WriteLine("NOT_RUNNING_ON_4 was set");
#endif
}
}
Затем я мог переключаться между таргетингом 3.5 и 4.0, и он делал все правильно.