2016-06-14 91 views
0

我有幾個枚舉標誌,它們表示版本的外部系統。我想確保,每當外部系統升級其版本時,我的功能應該能夠支持它(我會提前知道該版本將升級,因此它是一種主動行動)。此外,我的通信必須與這個系統在兩個方向上進行,這意味着內部和外部通信可以有不同的版本集。十進制值/名稱的枚舉標誌轉換

我創建了一個枚舉標誌來表示這些版本。

[Flags] 
public enum ExternalSystemVersionEnum 
{ 
    System1 = 1, 
    System2 = 2, 
    System3 = 4, 
    All = 7 
} 

這對正式的主要升級正常工作。可悲的是我不能將它們命名爲System1.0或更高版本。此外,作爲其小數,我不能使用泛型枚舉分析器。

(T) Enum.Parse(typeof (T), Convert.ToString(enumValue)); 

當然,我仍然可以通過使用開關/ if語句代替,但我真的想避免不惜一切任何硬編碼(甚至資源/ Contants如果我能)實現上述目標,作爲一個外部系統的版本可能會被完全丟棄,而且我不想爲追逐所有字符串而煩惱。

此外,我需要標誌或等效功能,因爲我仍然可以接收沒有系統版本標識,默認情況下進入到適用於所有版本通信。另一種通信可能僅適用於某些選擇版本,例如。只適用於2.0以後等

請注意,我可以通過使用Switch/If輕鬆實現此目的,但我不希望有任何硬編碼,除非沒有其他(簡單)方法。我的主要關注點是具有一個功能,的作用類似於標誌,但很容易標識具有小數位的值,比如1.0或1.2或1.3.1(儘管在歷史中它們從未有過小數點的兩倍) ,並提供編譯時間失敗。我願意接受其他機制的建議,但我更喜歡它是一個簡單的邏輯,因爲它是整個過程中非常微不足道的一部分。

+1

什麼靜態類? 'public static class ExternalSystemVersionEnum { public static double System1 = 1.0; public static double System2 = 2.0; public static double System3 = 4。0; public static double All = 7; }' –

+0

我不確定它是否具有與HasFlag檢查相同的功能。並不是說構建它非常複雜,而是避免了不必要的代碼並減少了維護。 但是,您能否請進一步解釋一下,因爲我可能沒有正確理解它? – touchofevil

回答

2

什麼

[Flags] 
public enum ExternalSystemVersionEnum 
{ 
    System1_1 = 1, 
    System2_1 = 2, 
    System3_2 = 4, 
    All = 7 
} 

var enumString = decimalValue.ToString("0.0", 
    CultureInfo.InvarantCulture).Replace('.', "_"); 

var enumValue = (ExternalSystemVersionEnum)Enum.Parse(
    typeof(ExternalSystemVersionEnum), enumString); 
+0

具有很多意義。這是一種通用的邏輯,完美地結合了需求。 :) – touchofevil

1

聽起來像這些值可能會改變,取決於連接的系統和連接的系統是否會升級。爲了消除硬編碼並使其更加靈活,我建議將數據作爲app.config文件中的自定義部分添加。通過這種方式,您可以輕鬆修改/添加/刪除值,而無需在每次更改時重新編譯。

<configSections> 
    <section name="SystemVersions" type="YourAppName.SystemVersionSection, YourAppName" /> 
</configSections> 

<SystemVersions> 
    <system version="1.0" /> 
    <system version="2.0" /> 
    <system version="1.3.1" /> 
    <system version="All" /> 
</SystemVersions> 

此CodeProject頁面Custom Configuration Sections for Lazy Coders可能會幫助你。

我知道這並不完全符合您使用Enum的要求,但有時候替代設計會更好地適合整體。

+0

謝謝你的回覆。但恐怕,對於這種特殊情況我不能使用這個建議。雖然它提供了豐富的信息,但對該鏈接投了贊成票。 – touchofevil