根据框架版本实现接口

时间:2013-04-15 09:36:27

标签: c# .net interface compilation

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

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

作为一个例子,我正在寻找类似于MSBuild配置的内容,即“在两个[或更多]版本中编译此库”,然后为每个版本指定不同的选项,如定义的符号,框架,引用等。

如果可以的话,它实际上可以解决我一直遇到的其他类似问题。

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分: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

显然,也可以将部分类划分为文件,因此只需在项目的.NET 4.5版本中包含此部分类文件,就可以完全没有#if