c# -支持同一源代码中不同版本的程序

本文关键字:版本 程序 源代码 支持 | 更新日期: 2023-09-27 18:11:29

我正在构建一个程序,其中许多部分可能根据版本而更改,我希望在同一源代码中支持这些更改,能够仅更改一两行代码以在版本之间进行交换。

例如,假设我有Test方法,对于版本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 with values(因此我可以使用#IF VERSION == 1),因此我认为支持这一点的唯一方法是使用const,将其转换为如下内容:

public int Test() {
    int val = 1;
    val += 100;
    if (version == 2)
        val *= 2;
    return val;
}

但是,如果有很多这样的变化,这会对性能不利吗?或者c#会自动忽略不可访问的代码吗?或者是否有更好的方法来解决这个问题?

我希望我说得很清楚,谢谢。

c# -支持同一源代码中不同版本的程序

更面向对象的方法是将此代码分成两个类:

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容器或工厂为接口注册正确的版本。

您可以在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
}

如果你想通过类来分离版本,那么用TestClass来代替Test方法,然后用TestClass_2来代替该方法的不同行为,你可以很容易地使用依赖注入框架来实现它。您可以用一行设置代码替换应用程序中使用的整个类并重新编译。

参见https://simpleinjector.org/index.html作为参考/示例