C# 根据框架版本实现接口
我正在编写一个库,如果可能的话,我想要一个类来实现和使用C# 根据框架版本实现接口,c#,.net,interface,compilation,C#,.net,Interface,Compilation,我正在编写一个库,如果可能的话,我想要一个类来实现和使用IReadOnlyList。然而,该接口仅在框架版本4.5开始可用,我不想仅仅因为这一个接口而被绑定到该版本 是否有一种方法可以自动编译库的两个版本,一个用于4.5(将实现接口,并且可能还具有一些其他功能),另一个用于3.5 例如,我正在寻找类似MSBuild配置的内容,该配置说明“将此库编译为两个[或更多]版本”,然后为每个版本指定不同的选项,如定义的符号、框架、引用等 如果这是可能的,它实际上可以解决我遇到的许多其他类似问题。您可以使用
IReadOnlyList
。然而,该接口仅在框架版本4.5开始可用,我不想仅仅因为这一个接口而被绑定到该版本
是否有一种方法可以自动编译库的两个版本,一个用于4.5(将实现接口,并且可能还具有一些其他功能),另一个用于3.5
例如,我正在寻找类似MSBuild配置的内容,该配置说明“将此库编译为两个[或更多]版本”,然后为每个版本指定不同的选项,如定义的符号、框架、引用等
如果这是可能的,它实际上可以解决我遇到的许多其他类似问题。您可以使用编译器指令,例如
#if NET45
//specific code for .NET 4.5
#endif
然后创建两个项目,每个版本一个,使用来维护单个代码库。在.NET 4.5项目中,可以在生成时指定
NET45
变量。这样,#if
块中的代码将只在其中一个版本中使用。您可以创建两个版本的项目文件,针对不同的框架版本。在本例中,我将把所有项目文件放在现有项目目录中
在每个项目中,您将定义一个表示框架版本(根据需要)的符号,例如DOTNET45
。您可以在属性-构建-条件编译符号下执行此操作
然后,您可以使用:
类MyClass:IList
#如果DOTNET45
,IReadOnlyList
#恩迪夫
{
//你通常的代码
#如果DOTNET45
//IReadOnlyList实现
#恩迪夫
}
然而,这可能会变得一团糟。因此,您也可以使用分部类:
partial class MyClass<T>
{
}
#if DOTNET45
partial class MyClass<T> : IReadOnlyList<int>
{
// IReadOnlyList implementation
}
#endif
部分类MyClass
{
}
#如果DOTNET45
分部类MyClass:IReadOnlyList
{
//IReadOnlyList实现
}
#恩迪夫
显然,部分类也可以被划分为多个文件,因此,如果将此部分类文件包含在.NET 4.5版本的项目中,那么您可以完全不使用
。我更喜欢这个问题,当它说并且我是一个类时:
:d很抱歉,可能是,我没有意识到预处理器指令适用于类型定义。然而,问题并不完全相同。我特别要求提供一种自动编译库的两个不同版本的方法。谢谢。这是一个可能的解决办法。但是有没有一种方法可以自动做到这一点?您仍然需要设置项目结构,但这是一次性操作。您是否知道,如果只有一个项目具有提供.NET 4.5接口的文件,那么扩展是否可以与分部类一起工作?是的,这是可能的,但您仍然需要项目链接器。您可以将其中一个项目中代码文件的设置更改为“buildaction:none”,我看到了。真是太好了。它将解决很多问题。这是一个伟大的解决方案!我可以使用额外的部分类定义来存储所有.NET4.5接口,包括方法和类似的东西。
partial class MyClass<T>
{
}
#if DOTNET45
partial class MyClass<T> : IReadOnlyList<int>
{
// IReadOnlyList implementation
}
#endif