2008-09-02 139 views
6

我想大家都看過類似的代碼:使用屬性以減少枚舉枚舉映射和枚舉/常量行動開關statments

public void Server2ClientEnumConvert(ServerEnum server) 
{ 
    switch(server) 
    { 
     case ServerEnum.One: 
      return ClientEnum.ABC 
     //And so on. 

相反,這個壞我們可以做財產以後類似的:

public enum ServerEnum 
{ 
    [Enum2Enum(ClientEnum.ABC)] 
    One, 
} 

現在我們可以使用反射來通過ServerEnum翻錄並從枚舉聲明本身獲取轉換映射。

我在這裏遇到的問題是在Enum2Enum屬性的聲明中。

這個工作,但用Enum e替換對象o不行。我不想將對象傳遞給構造函數,只能傳入其他枚舉。

public class EnumToEnumAttribute : Attribute 
{ 
    public EnumToEnumAttribute(object o){} 
} 

這不能編譯。

public class EnumToEnumAttribute : Attribute 
{ 
    public EnumToEnumAttribute(Enum e){} 
} 

是否有編譯錯誤的原因?我還能怎樣傳遞到除了地圖所需的信息:

EnumtoEnumAttribute(Type dest, string enumString) 

這似乎太冗長,但如果它是唯一的出路,然後我想我會用它。

+0

你得到了什麼編譯錯誤?哪裏? – 2008-12-26 06:55:35

回答

0

我可能會使用結構作爲類型,然後拋出一個異常,如果它不是一個枚舉類型。我沒有看到你的(類型,字符串)選項比使用對象或結構更安全。

0

@Danial詹寧斯我通過規則有閱讀和發現:「枚舉類型,只要它具有公共可訪問性和類型在其中嵌套(如果有的話)也具有公共可訪問性(第17.2節)。「

如何在構造函數中嘗試Enum e基於引用的規則失敗?是否因爲類型枚舉不能保證傳入的枚舉是公開可見的?這似乎是正確的。在編譯時有沒有辦法強制這條規則?

@ bdukes你是完全正確的。我應該多想一想。

它看起來像運行時類型檢查是我唯一的選擇,以確保我只是將枚舉映射到其他枚舉。

0

爲什麼不使用字典?這可能是你的類的靜態屬性,用我們在3.0中獲得的那些奇特的schmancy對象初始值設定項初始化?你不會輸入更多的代碼(即使使用Attribute solution也必須完成映射)。

4

使用幾乎相同的例子,你可以直接在枚舉實現這一點:

public enum ServerEnum 
{ 
    One = ClientEnum.ABC, 
} 

這具有不需要思考的好處,更易於讀取(在我看來),以及整體需要更少的開銷。