【问题标题】:Implement interface depending on framework version根据框架版本实现接口
【发布时间】:2013-04-15 09:36:27
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c# .net interface compilation


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。这是一个可能的解决方案。但是有没有办法自动做到这一点?
  • 您仍然需要设置项目结构,但这是一次性操作。
  • 你知道是否有可能使扩展与部分类一起工作,只有一个项目具有提供 .NET 4.5 接口的文件?
  • 是的,这是可能的,但您仍然需要项目链接器。您可以将其中一个项目中代码文件的设置更改为“构建操作:无”
  • 我明白了。这很甜蜜。它会解决很多问题。
【解决方案2】:

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

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

下执行此操作

然后你可以使用#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

显然,部分类也可以在文件中进行划分,因此您可以完全不使用 #if,只需在项目的 .NET 4.5 版本中包含这个部分类文件。

【讨论】:

  • 这是一个很好的解决方案!我可以使用额外的部分类定义来存储所有 .NET 4.5 接口,包括方法和类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
相关资源
最近更新 更多