17

这是我想做的一个具体例子。

考虑string.Join函数。在 .NET 4.0 之前,只有两个重载,都需要一个string[]参数。

从 .NET 4.0 开始,有新的重载采用更灵活的参数类型,包括IEnumerable<string>.

我有一个库,其中包含一个Join基本上完成 .NET 4.0string.Join功能的功能。我只是想知道我是否可以使这个函数的实现依赖于目标.NET 框架。如果是 4.0,它可以简单地在string.Join内部调用。如果 3.5 或更早版本,它可以调用自己的内部实现。

  1. 这个想法有意义吗?
  2. 如果它确实有意义,那么最合乎逻辑的方法是什么?我想我只是假设预处理器指令最有意义,因为在针对 .NET 版本早于 4.0 时string.Join,使用IEnumerable<string>参数调用甚至不会编译;所以我使用的任何方法都必须在编译之前进行。(例如,在运行时检查Environment.Version属性是行不通的。)
4

3 回答 3

15

您可以查看 Stack Overflow 上的另一个问题,该问题说明了如何通过项目文件的 XML 设置条件常量: Detect target framework version at compile time

然后使用它,您可以确定是否应该使用 .NET 4 重载或您自己的库。

于 2010-12-26T22:19:30.603 回答
2

是的,我认为这是有道理的(对于您的特定情况,因为变化相对较小),尽管显然这种事情可能很快就会失控。

恕我直言,最合乎逻辑的方法是为每个版本创建不同的解决方案/项目配置,然后NET40在您的 4.0 配置中定义一个自定义符号(例如,),然后将其与#if. 我不确定配置是否允许您更改运行时版本(这显然是完美的解决方案),但您最坏的情况是必须手动更改版本。

编辑:我刚刚看到了与 Joshua 的答案相关的答案,这似乎是一个更精简的解决方案,但无论如何我都会把它留在这里,因为严格来说,它确实回答了这个问题。

于 2010-12-26T22:19:52.377 回答
2

您可以为 .NET 4.0 准备代码,并根据框架检测为 .NET 3.5 编写类似的代码。

#if NOT_RUNNING_ON_4
public static class GuidExtensions
{
   public static bool TryParse(this string s, out Guid result)
   {
       if (s.IsNullOrEmpty())
           return null;
       try
       {
          return new Guid(s);
       }
       catch (FormatException)
       {
          return null;
      }
   }
}
#else
    #error switch parsing to .NET 4.0
#endif

并将他的线路放到您的 *.csproj

<DefineConstants Condition=" '$(TargetFrameworkVersion)' != 'v4.0' ">NOT_RUNNING_ON_4</DefineConstants>
于 2014-08-06T12:11:47.290 回答