2015-09-05 98 views
1

我正在構建一個程序,其中許多部分可能會根據某個版本進行更改,並且我希望在同一個源代碼中支持這些更改,能夠更改只需一兩行代碼即可在版本之間進行交換。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,將其變成類似於:

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

    return val; 
} 

但是,如果這樣的變化很多,這會對性能造成影響嗎?或者C#會自動忽略無法訪問的代碼?還是有更好的方法來解決這個問題?

我希望我很清楚,在此先感謝。

回答

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容器或工廠爲界面註冊正確的版本。

0

您可以在app.config文件上進行配置以設置此version標誌。例如,在你的app.config文件中:

<appSettings> 
    <add key="version" value="1" /> 
</appSettings> 

所以,你可以閱讀它。

int version = int.Parse(ConfigurationManager.AppSettings["version"]); 

然後您可以使用此version值來實現您的方法。

我不確定它是這種情況,但您可以閱讀給定組件的Version。如果你想版本按類分開,而不是

if (version == "2.0.0.0") 
{ 
    // something for version 2.0.0.0 
} 
0

,說:對於樣品,讀取執行中的程序集的版本,你可以試試這個:

var version = Assembly.GetExecutingAssembly().GetName().Version; 

,你可以檢查它TestClass與您的方法Test進行比較,隨後在TestClass_2上使用該方法的不同行爲,您可以使用依賴注入框架輕鬆實現該方法。您可以使用一行安裝程序代碼替換您的應用程序中使用的整個類並重新編譯。

https://simpleinjector.org/index.html作爲參考/示例

相關問題