C# - 在同一源中支持不同版本的程序

时间:2015-09-05 00:29:30

标签: c#

我正在构建一个程序,其中许多部分可能会根据版本进行更改,我想在同一个源中支持这些更改,只需更改一行或两行代码即可进行更改版本

例如,让我们说我的测试方法和版本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#会自动忽略无法访问的代码吗?或者有更好的方法解决这个问题吗?

我希望我很清楚,先谢谢。

3 个答案:

答案 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作为参考/示例