2012-10-17 199 views
0

我有很多從服務返回並想要映射到我的枚舉類型的枚舉類型。 我想要的是創建一個具有所有轉換邏輯的映射器類。 我做了這樣的事情:將枚舉轉換爲其他枚舉

public static class ErrEnumMapper 
{ 
    private static Dictionary<FullErrorTypeError, eError> dictionary; 

    static ErrEnumMapper() 
    { 
     var dictionary = new Dictionary<FullErrorTypeError, eError>() 
     { 
      {FullErrorTypeError.APP, eError.APPLICATION}, 
      {FullErrorTypeError.INF, eError.INF}, 
      {FullErrorTypeError.NO, eError.NONE}, 
      {FullErrorTypeError.PAX, eError.PASSENGER}, 
      {FullErrorTypeError.SYS, eError.SYSTEM} 
     }; 
    } 

    public static eError GetEnum(FullErrorTypeError key) 
    { 
     var val = dictionary[key]; 
     if (val != null) 
      return val; 

     throw new InvalidOperationException(); 
    } 
} 

但因爲我有很多其他枚舉,通過這種方式,我會創造出許多靜態字段(如「字典」域)和它們的等效方法(如「GetEnum 「)...有一個更好的方法嗎? 通用也許?

+2

如果你想映射所有枚舉1on1,爲什麼不使用它們呢? – KyorCode

+0

我們的域名應用程序中有一個命名約定,由我們的系統架構師指定 –

+0

我不認爲您可以通用。如果您可以確定通常哪個值映射到哪個其他值,則可以使用反射來完成。 (你的GetEnum函數可能是通用的,但我認爲你需要一個字典的附加字典來選擇給定類型的正確字典)。 –

回答

2

除非兩個枚舉集的整數值或名稱相同,否則不能將某個枚舉值轉換爲另一個枚舉值,而無需進行某種手動映射。

幾點建議:

  1. 重用如果可能的話
  2. 保持映射枚舉一樣的原始枚舉的整數值,所以你可以從一個到另一個投原來的枚舉。
  3. 爲枚舉名稱使用約定,以便您可以從一個映射到另一個。
  4. 在每個映射的枚舉值上使用自定義屬性,指示相關的原始枚舉值,並且ErrEnumMapper讀取該屬性。仍然手動映射,也許重新組織。

當然,本着KISS的精神,我會堅持#1,#2,或者只是處理手動映射。

+0

多數民衆贊成在我的想法,但我沒有控制服務枚舉,他們的整數/順序等。 –

0

也許我真的不得到你的意思..但你可以明確地投他們,如果他們有相同的基本價值:

enum FirstEnum { 
    ONE, 
    TWO, 
    THREE 
} 

enum SecondEnum { 
    FOUR, 
    FIVE, 
    SIX 
} 

static void Main(string[] args) { 
    FirstEnum first = FirstEnum.ONE; 

    SecondEnum second = (SecondEnum)first; 

    Console.WriteLine(second); // prints FOUR 
} 

這可以讓你保持你的命名約定..