4

我正在编写一个库,如果可能的话,我想要一个类来实现和使用IReadOnlyList<T>。但是,该接口仅从框架版本 4.5 开始可用,我不想仅仅因为这个接口而被绑定到该版本。

有没有一种方法可以自动编译两个版本的库,一个用于 4.5(将实现接口,并且可能还有一些其他功能),另一个用于 3.5?

举个例子,我正在寻找类似 MSBuild 配置的东西,上面写着“在两个 [或更多] 版本中编译这个库”,然后为每个版本指定不同的选项,比如定义的符号、框架、引用等。

如果这是可能的,它实际上可以解决我遇到的许多其他类似问题。

4

2 回答 2

6

您可以使用编译器指令,例如

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

然后创建两个项目,每个版本一个,使用Project Linker维护单个代码库。在 .NET 4.5 项目中,您可以NET45在构建时指定变量。这样,#if块中的代码将仅用于其中一个版本。

于 2013-04-15T09:45:55.843 回答
4

您可以制作两个版本的项目文件,针对不同的框架版本。在这种情况下,我会将所有项目文件放在现有项目目录中。

在每个项目中,您将定义一个表示框架版本的符号(根据需要),例如DOTNET45. 您可以在Properties - Build - Conditional Compilation Symbols下执行此操作

然后你可以使用#if指令

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 版本中包含这个部分类文件。

于 2013-04-15T09:57:09.210 回答