我正在编写一个库,如果可能的话,我想要一个类来实现和使用IReadOnlyList<T>
。但是,该接口仅在框架版本4.5开始时可用,并且我不希望仅仅因为这个接口而与该版本绑定。
有没有办法可以自动编译两个版本的库,一个用于4.5(实现接口,也可能有其他一些功能),另一个用于3.5?
作为一个例子,我正在寻找类似于MSBuild配置的内容,即“在两个[或更多]版本中编译此库”,然后为每个版本指定不同的选项,如定义的符号,框架,引用等。
如果可以的话,它实际上可以解决我一直遇到的其他类似问题。
答案 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
。