Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据框架版本实现接口_C#_.net_Interface_Compilation - Fatal编程技术网

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