2010-08-31 78 views
10

因此,目前有一個枚舉用於應用程序的狀態。然而,使用它反對UI時會感覺到一些東西。在填充下拉菜單時,要在整數和字符串之間進行許多轉換。我可以使用擴展方法或類型轉換器,並繼續使用枚舉,如果枚舉在其中包含多個單詞,將會很有幫助。什麼使用除了枚舉的c#

以爲我會在深入挖掘之前詢問有關填充可能的洞的信息。

謝謝。

+1

有一個類似的,無關的問題與一些很好的迴應:http://stackoverflow.com/questions/1970594/enums-or-tables – 2010-08-31 21:44:21

+0

是否正確假設您使用的用戶界面是與wpf? – 2010-08-31 21:44:41

+0

你是否反對寫一個可以做同樣事情的靜態類,以避免出現拳擊問題? – joshlrogers 2010-08-31 21:46:05

回答

5

如果您使用的變量具有有限且衆所周知的可能狀態數,那麼枚舉確實是您使用的正確構造。有許多可行的方法可以使UI更方便的工作,並且您已經列舉了兩種優秀的方法,即類型轉換器和擴展方法。

14

我的團隊在我們最近的項目中遇到了這個問題。我們保留枚舉,因爲它們是用於已知常量值的有限列表的東西,但我們做了一些事情來使它們對開發更友好:

  1. 我們用[Description( )]包含每個枚舉常量的「友好名稱」的屬性。
  2. 我們創建了一個GetDescription()擴展方法,它可以反射性地檢查枚舉常量的Description屬性並返回友好名稱。如果它沒有,則該方法嘗試將空格插入枚舉常量名的ToString()中。由於CamelCased枚舉常量是ReSharper強制執行的樣式要求,因此它對我們常量中的大約90%起作用,並且Description屬性處理了其餘大部分(大多數是大寫字母縮寫詞)。
  3. 我們爲基本上包裝了Enum.Parse()的字符串創建了一個ParseEnum()通用擴展方法,它是oogly;需要在該方法中指定Enum類型,然後將其轉換爲該類型。我認爲先嚐試查找描述屬性可能足夠聰明,否則我們只需使用可讀的ToString()表示作爲下拉項目的數據值。

因此,考慮到以下幾點:

public enum MyItems 
{ 
    [Description("Item One")] 
    ItemOne, 
    [Description("Item Two")] 
    ItemTwo, 
    [Description("Item Three")] 
    ItemThree 
} 

,我們可以在兩行填充人性化的選擇一個DropDownList:

foreach(MyValues value in Enum.GetValues<MyValues>()) 
    myDDL.Items.Add(New ListItem(value.GetDescription(), value.ToString()) 

......然後我們就可以解析的選擇以非常可讀的代碼退出:

var theValue = myDDL.SelectedItem.Value.ParseEnum<MyValues>() 

編輯:我已被問爲GetDescription()方法。我對分享整個事情有點不滿意,但這裏是獲取裝飾枚舉常量的Description屬性的基本算法。解析一個CamelCased的名字是非常簡單的RegEx以大寫字母分割,我們的實現有點天真。此代碼段需要System.ComponentModel.DescriptionAttribute(這也是枚舉常數裝飾)和enumType是擴展方法的「本」參數,類型的枚舉:

var attr = enumType.GetType().GetField(enumType.ToString()) 
       .GetCustomAttributes(typeof(DescriptionAttribute), false); 
    if (attr.Length > 0) 
     return ((DescriptionAttribute)attr[0]).Description; 
+0

所有非常好的建議。任何時候我建立一個新的項目我的解析方法總是推在:) – 2010-08-31 22:14:42

+0

哎呀!美:-)我可以問你的GetDescription擴展名。爲了同樣的目的,我寫了一個帶有枚舉名稱的特殊字典類,但是你的方法似乎更加乾淨。 – greenoldman 2010-09-01 06:17:20

+0

通過在代碼中對用戶可見名稱進行硬編碼,如果客戶決定他們想要看到「Item 1」而不是「Item One」,那麼您正在承諾重新構建和重新分發整個應用程序。您還通過使用資源文件/附屬程序集來防止系統本地化。 – mikemanne 2010-09-01 16:12:48

0

枚舉樣構建絕對是正確的選擇。如果由於某種原因你不想使用熟悉的內置方式,你可以讓自己更加實用。這裏的基本思路:

class Country { 
    private static Country US; 
    private static Country JP 

    static Country() { //initialize static variables } 
    private Country(string name) { //initialize variables of Country instance } 

    } 

有一個這樣的設計模式,但我忘了名字。

+0

我記得在某個地方做了這個,但是這對於一個枚舉來說真的更可取,還是有很大的區別?枚舉確實給了我一個整數值來對應我的數據庫中的ID iny,這意味着少一次轉換。關閉做一些研究,謝謝。 – Aur 2010-09-01 01:56:34