2012-07-24 75 views
2

我有一個簡單枚舉:訂購具有相同的整數值在C#枚舉元素

enum E 
{ 
    FullNameForA = 1, 
    A = 1, 
    FullNameForB = 2, 
    B = 2 
} 

我們的目標是能夠爲與一捻相同積分值使用不同的字符串值 - FullNameFor *必須被用作默認值。換句話說,用戶可以提供E.A作爲輸入,但代碼應該使用E.FullNameForA來輸出。

它似乎默認情況下C#將使用具有相同整數值的元素的字母順序,這使得我的目標更難。是對的嗎?任何想法如何克服這一點?

+0

誰是您的用戶?他們是開發者嗎? – Tigran 2012-07-24 19:03:54

+0

不,外部API。 – Schultz9999 2012-07-24 19:13:38

回答

6

好像默認爲C#將使用元素的字母排序用相同的積分值

在什麼情況下?當你將值轉換回字符串?從Enum.ToString文檔:

如果多個枚舉成員具有相同的基礎值,並嘗試獲取基於其基礎值的枚舉成員名稱的字符串表示,你的代碼不應該做任何假設哪名該方法將返回。

(請注意,這一決定是在BCL - 它不是一個語言決定。)

我建議,如果你想爲每個值規範字符串表示,創建一個Dictionary<E, string>和請諮詢,而不是致電ToString()

+0

是的,ToString使用第一個元素。字典可能是最簡單的。我想過使用最長的一個,因爲同一個int的所有值中只有一個真的是完整和冗長的。但是這將需要對我不特別喜歡的枚舉成員進行大量迭代。擁有靜態字典消除了這種開銷。 – Schultz9999 2012-07-24 19:10:28

2

考慮這種替代解決方案。可以裝飾枚舉值與DescriptionAttribute,並有更多的人友好的名稱:

enum E 
{ 
    [System.ComponentModel.Description("FullNameForA")] 
    A = 1 
} 

然後你就可以提取屬性的值,像這樣:

public static string AsString(this Enum value) 
{ 
    var type = value.GetType(); 

    if (!type.IsEnum) 
     throw new ArgumentException(); 

    var fieldInfo = type.GetField(value.ToString()); 
    if (fieldInfo == null) 
     return value.ToString(); 

    var attribs = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[]; 

    return attribs.Length > 0 ? attribs[0].Description : value.ToString(); 
} 

當然這不是最好的解決方案,因爲它依賴於反思。

+0

有趣的想法。基本上由Jon Skeet提出的集成詞典。 – Schultz9999 2012-07-24 19:12:48