我正在构建一个程序,其中许多部分可能会根据版本进行更改,我想在同一个源中支持这些更改,只需更改一行或两行代码即可进行更改版本
例如,让我们说我的测试方法和版本1:
public int Test() {
int val = 1;
val += 100;
return val;
}
对于版本2:
public int Test() {
int val = 1;
val += 100;
val *= 2;
return val;
}
由于C#不支持带有值的#define(所以我可以使用#IF VERSION == 1),我认为支持这个的唯一方法是使用const,将其转换为:< / p>
public int Test() {
int val = 1;
val += 100;
if (version == 2)
val *= 2;
return val;
}
但是,如果有这么多的变化会对性能造成影响吗? 或者C#会自动忽略无法访问的代码吗?或者有更好的方法解决这个问题吗?
我希望我很清楚,先谢谢。
答案 0 :(得分:2)
面向对象的方法是将此代码拆分为两个类:
public interface IMyClass {
int Test();
}
class MyClass1 : IMyClass {
public virtual int Test() {
int val = 1;
val += 100;
return val;
}
}
class MyClass2 {
public override int Test() {
return 2*base.Test()
}
}
外部代码将使用IMyInterface并且完全不知道它正在使用的实际实现。然后,您可以使用IoC Container或工厂为接口注册正确的版本。
答案 1 :(得分:0)
您可以在app.config
文件上进行配置以设置此version
标志。例如,在app.config文件中:
<appSettings>
<add key="version" value="1" />
</appSettings>
所以,你可以阅读它。
int version = int.Parse(ConfigurationManager.AppSettings["version"]);
然后您可以使用此version
值来实现您的方法。
我不确定是不是这样,但您可以阅读给定程序集的Version
。对于示例,要读取正在执行的程序集的版本,您可以尝试:
var version = Assembly.GetExecutingAssembly().GetName().Version;
你可以检查一下:
if (version == "2.0.0.0")
{
// something for version 2.0.0.0
}
答案 2 :(得分:0)
如果您希望按类别分隔版本,请使用您的方法Test测试TestClass,然后使用该方法的不同行为使用TestClass_2,您可以使用依赖注入框架轻松实现它。您可以使用一行设置代码替换应用程序中使用的整个类并重新编译。
请参阅https://simpleinjector.org/index.html作为参考/示例