2013-10-23 152 views
5

我試圖創建幾個enums,因此給出Dropdown.Category.Subcategory的語法。但是,我一直在閱讀,這不是一個好主意。我的選擇主要是因爲我不能想出任何其他方式來根據類別的選擇選擇不同的enum值,然後基於enum值選擇enum替代嵌套枚舉

有沒有更好的方法來創建這樣的功能?我希望能夠輕鬆識別.Category.Subcategory這兩個名稱,如果此代碼可讀,這將是一項獎勵。

爲了說清楚,我希望能夠選擇Category,然後選擇適當的Subcategory選項。

public class Dropdown 
{ 
    public enum Gifts 
    { 
     GreetingCards, 
     VideoGreetings, 
     UnusualGifts, 
     ArtsAndCrafts, 
     HandmadeJewelry, 
     GiftsforGeeks, 
     PostcardsFrom, 
     RecycledCrafts, 
     Other 
    } 
    public enum GraphicsAndDesign 
    { 
     CartoonsAndCaricatures, 
     LogoDesign, 
     Illustration, 
     EbookCoversAndPackages, 
     WebDesignAndUI, 
     PhotographyAndPhotoshopping, 
     PresentationDesign, 
     FlyersAndBrochures, 
     BusinessCards, 
     BannersAndHeaders, 
     Architecture, 
     LandingPages, 
     Other 
    } 
} 
+1

你在讀什麼,爲什麼說這不是個好主意?在大多數情況下,枚舉不應該嵌套在類中;他們應該處於頂級水平,但這似乎是一個合適的上下文。在大多數情況下,儘管通過它的父類型始終訪問枚舉只是令人討厭的。如果它在某種情況下是有益的,那就沒問題。 – Servy

+0

你確定你不需要數據庫嗎? – acfrancis

+0

如果這些枚舉只在Dropdown類中使用,那麼沒有理由不去做你現在正在做的事情。 –

回答

4

創建一個不能從外部繼承的類,給它幾個內部類,每個類都從它繼承。然後添加靜態只讀變量每個值要代表:

public class Dropdown 
{ 
    private string value; 

    //prevent external inheritance 
    private Dropdown(string value) 
    { 
     this.value = value; 
    } 

    public class Gifts : Dropdown 
    { 
     //prevent external inheritance 
     private Gifts(string value) : base(value) { } 

     public static readonly Dropdown GreetingCards = 
      new Gifts("GreetingCards"); 
     public static readonly Dropdown VideoGreetings = 
      new Gifts("VideoGreetings"); 
     public static readonly Dropdown UnusualGifts = 
      new Gifts("UnusualGifts"); 
     public static readonly Dropdown ArtsAndCrafts = 
      new Gifts("ArtsAndCrafts"); 
    } 
    public class GraphicsAndDesign : Dropdown 
    { 
     //prevent external inheritance 
     private GraphicsAndDesign(string value) : base(value) { } 

     public static readonly Dropdown CartoonsAndCaricatures = 
      new GraphicsAndDesign("CartoonsAndCaricatures"); 
     public static readonly Dropdown LogoDesign = 
      new GraphicsAndDesign("LogoDesign"); 
     public static readonly Dropdown Illustration = 
      new GraphicsAndDesign("Illustration"); 
    } 

    public override string ToString() 
    { 
     return value; 
    } 
} 

在這種情況下,每一個值實際上是Dropdown類型的實例,所以你可以有,也就是說,一個參數的方法接受Dropdown實例。有了枚舉,就沒有辦法說:「我想接受Dropdown類中聲明的任何枚舉。」

下面是一些例子用法:

public static void UseDropdown(Dropdown type) 
{ 
    if (type is Dropdown.Gifts) 
    { 
     if (type == Dropdown.Gifts.GreetingCards) 
     { 
      DoStuff(); 

     } 
    } 
    else if (type is Dropdown.GraphicsAndDesign) 
    { 
    } 
} 

你也可以有一個不接受Gifts型或GraphicsAndDesign的對象,如果你只想要一個子類是在某些情況下有效的參數。

不幸的是,使用這個解決方案沒有好的辦法來switch下拉值;您必須使用if/else if鏈來檢查值。

實例字符串值的使用可能不是必需的(請參閱沒有它的版本的第一個修訂版本),但它能夠有一個有意義的字符串值(或其他類型的值;您可以將一個整數,一個字節或任何與每個枚舉值關聯)。

如果沒有被覆蓋,EqualsGetHashCode實現應該是有意義的。

如果項目應按照某種方式進行邏輯排序,您可以實施IComparable,如真正的枚舉。

+0

比我的+1更好的解決方案。我正在考慮刪除我的;-( – Harrison

+0

不得不說,這真的很高雅。非常感謝,我更喜歡這個! –

+0

小問題,這個語法是有效的代碼,因爲繼承了'Dropdown':'Dropdown .Gifts.GraphicsAndDesign.Gifts.GraphicsAndDesign'等。 –