2013-04-15 3 views
3

Я пишу библиотеку, и я хочу, чтобы класс реализовал и использовал IReadOnlyList<T>, если это возможно. Однако этот интерфейс доступен только начиная с версии 4.5, и я не хочу привязываться к этой версии только из-за этого одного интерфейса.Внедрить интерфейс в зависимости от версии фрейма

Есть ли способ, которым я могу автоматически скомпилировать две версии библиотеки, одну для 4.5 (которая будет реализовывать интерфейс и, возможно, также иметь некоторые другие функции), а другая для 3.5?

В качестве примера я ищу что-то вроде конфигурации MSBuild, которая говорит: «Скомпилируйте эту библиотеку в двух [или более] версиях», а затем укажите разные параметры для каждого из них, например, определенные символы, рамки, ссылки и т. Д.

Если это возможно, это может фактически решить ряд других подобных проблем, которые у меня были.

+1

Мне понравился вопрос лучше, когда он сказал 'и я был классом': D – Nolonar

+1

Возможный дубликат [Условная компиляция в зависимости от версии фреймворка в C#] (http://stackoverflow.com/questions/408908/conditional -compilation-depends-on-the-framework-version-in-c-sharp) –

+0

Простите, я не понял, что директива препроцессора будет работать для определений типов. Однако вопросы не совсем то же самое. Я специально прошу о возможности автоматической компиляции двух разных версий библиотеки. – GregRos

ответ

6

Вы можете использовать директиву компилятора, например.

#if NET45 
//specific code for .NET 4.5 
#endif 

Затем создайте два проекта, один для каждой версии, используя Project Linker поддерживать единую кодовую. В проекте .NET 4.5 вы можете указать переменную NET45 в сборке. Таким образом, код в блоке #if будет использоваться только в одной из версий.

+0

Спасибо. Это возможное решение. Но есть ли способ автоматически сделать это? – GregRos

+2

Вам все равно нужно настроить структуру проекта, но это одноразовая операция. – Bas

+0

Это правда. Он работает очень хорошо. – GregRos

4

Вы можете создать две версии файла проекта, предназначенные для разных версий фреймворка. В этом случае я бы разместил все файлы проекта в существующем каталоге проекта.

В каждом проекте вы определяете символ, обозначающий версию фрейма (при необходимости), например DOTNET45. Вы можете сделать это под Свойства - Строительства - условной компиляции Символы

Затем вы можете использовать #if directive:

class MyClass<T> : IList<T> 
#if DOTNET45 
    , IReadOnlyList<T> 
#endif 
{ 
    // Your usual code 

    #if DOTNET45 

    // IReadOnlyList implementation 

    #endif 
} 

Это может запутаться однако. Таким образом, в качестве альтернативы, вы можете использовать частичные классы:

partial class MyClass<T> 
{ 
} 

#if DOTNET45 

partial class MyClass<T> : IReadOnlyList<int> 
{ 
    // IReadOnlyList implementation 
} 

#endif 

Очевидно частичные классы также могут быть разделены над файлами, поэтому потенциально вы могли бы обойтись без #if в целом, включая только этот частичный файл класса в версии этого в .NET 4.5 проект.

+0

Это отличное решение! Я мог бы использовать дополнительное определение частичного класса для хранения всего интерфейса .NET 4.5, включая методы и тому подобное. – GregRos

Смежные вопросы