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#会自动忽略不可访问的代码吗?或者是否有更好的方法来解决这个问题?
我希望我说得很清楚,谢谢。
更面向对象的方法是将此代码分成两个类:
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作为参考/示例