这是我想要做的具体例子。
考虑string.Join
功能。在.NET 4.0之前,只有两个重载,这两个重载都需要一个string[]
参数。
从.NET 4.0开始,新的重载采用了更灵活的参数类型,包括IEnumerable<string>
。
我有一个包含Join
函数的库,它基本上完成了.NET 4.0 string.Join
函数的功能。我只是想知道我是否可以使这个功能的实现依赖于目标.NET框架。如果是4.0,则可以在内部简单地调用string.Join
。如果是3.5或更早,它可以调用自己的内部实现。
string.Join
参数调用IEnumerable<string>
甚至不会编译版本低于4.0;所以无论我使用什么方法都必须在编译之前进行。 (例如,在运行时检查Environment.Version
属性将不起作用。)答案 0 :(得分:15)
您可以查看Stack Overflow上的另一个问题,该问题说明了如何通过项目文件的XML设置条件常量: Detect target framework version at compile time
然后使用它可以确定是否应该使用.NET 4重载或您自己的库。
答案 1 :(得分:2)
是的,我认为这是有道理的(因为你的具体情况,因为这种变化相对较小),但显然这种事情可能会很快失控。
恕我直言,最合乎逻辑的方法是为每个版本创建不同的解决方案/项目配置,然后在4.0配置中定义自定义符号(例如NET40
),然后使用#if
。我不确定配置是否允许您更改运行时版本(这显然是完美的解决方案),但最糟糕的情况是必须手动更改版本。
编辑:我刚刚在Joshua的回答中看到了答案,这似乎是一个更简化的解决方案,但无论如何我都会留在这里,因为严格来说,它确实回答了问题
答案 2 :(得分:1)
您可以为.NET 4.0准备代码,并在framework detection上为.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>