我可以根据.NET框架版本制作预处理程序指令吗?

这是我想要做的具体例子。

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

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

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

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

您可以查看Stack Overflow上的另一个问题,该问题说明了如何通过项目文件的XML设置条件常量: 在编译时检测目标框架版本

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

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

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

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

您可以为.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

 NOT_RUNNING_ON_4