2009-02-05 87 views
17

我有一個存在大量項目的現有枚舉。C#中的枚舉子集或子集

我也有現有的代碼,這個枚舉做某些事情。

我現在想要一種方法來查看僅子集枚舉成員。我正在尋找的是一種將我的enum分成組的方法。我需要保留每個成員的(int)值,並且如果需要,我需要保留查看所有枚舉成員的能力。

我能想到的唯一的事情就是爲每個只包含我想使用相同名稱和值的項目創建一個新的枚舉。

這有效,但違反了整個無重複原則。

我不希望任何人有更好的選擇,但我想我會問,以防萬一有人有一個奇特的技巧來顯示我。

謝謝,一如既往。

+0

我不認爲有辦法做你想做的事情(這取決於你的意思是」視圖「)。但是如果你能描述更大的圖景,也許有更好的方法來實現你的目標? – colithium 2009-02-05 23:21:16

+0

我的枚舉的一點是允許開發人員根據其名稱選擇某個值。我的枚舉變得過大,有時如果開發人員只能看到基於某個分組的枚舉成員的子集,那麼這會很好。該分組是固定的。 – 2009-02-05 23:27:04

回答

2

最後,我不得不重寫許多代碼,但下面的「絕招」,導出:

我看不上C#枚舉和在常規類中使用靜態成員。這個類被製作成單例,並在應用程序啓動時被調用。

我的靜態成員的構造函數被允許引用另一個靜態成員作爲「父」。

接下來,我的init方法使用反射來檢查每個靜態成員,並根據幾個屬性爲它們編制索引。這些索引存儲在也是單例成員的哈希表中。

我從而得到:

一個單獨的對象,其中:

  • 具有可以在設計時可以很容易地訪問靜態成員。
  • 可以在運行時用來查找某些靜態成員(基於「組」和其他屬性)。

我的init方法做了相當數量的驗證。如果構建了無效(如重複)靜態成員,則在應用程序啓動時會出現運行時錯誤。

顯然是一個很大的黑客,但我很滿意它。

10

您可以使用枚舉定義值,然後通過靜態類中的常量引用它們,以便您的開發人員不會被大枚舉覆蓋。你可以有:

enum MySuperEnumGroup 
{ 
    Group1Item1, 
    Group1Item2, 
    Group1Item3, 

    Group2Item1, 
    Group2Item2, 
    Group2Item3, 

    Group3Item1, 
    Group3Item2, 
    Group3Item3, 
} 

static class MySuperEnumGroup_Group1 
{ 
    public const MySuperEnumGroup Item1 = MySuperEnumGroup.Group1Item1; 
    public const MySuperEnumGroup Item2 = MySuperEnumGroup.Group1Item2; 
    public const MySuperEnumGroup Item3 = MySuperEnumGroup.Group1Item3; 
} 

static class MySuperEnumGroup_Group2 
{ 
    public const MySuperEnumGroup Item1 = MySuperEnumGroup.Group2Item1; 
    public const MySuperEnumGroup Item2 = MySuperEnumGroup.Group2Item2; 
    public const MySuperEnumGroup Item3 = MySuperEnumGroup.Group2Item3; 
} 

//etc. 
+1

如何查看所有枚舉成員? – Mhd 2017-06-07 15:46:35

8

我將與此去(在VB.NET至少工作)

enum MySuperEnumGroup 
{ 
    Group1Item1, 
    Group1Item2, 
    Group1Item3, 

    Group2Item1, 
    Group2Item2, 
    Group2Item3, 

    Group3Item1, 
    Group3Item2, 
    Group3Item3, 
} 

enum MySubEnumGroup 
{ 
Group2Item1 = MySuperEnumGroup.Group2Item1 
Group3Item1 = MySuperEnumGroup.Group3Item1 
Group3Item3 = MySuperEnumGroup.Group3Item3 
} 

然後做一些CTYPE的,當您需要。

2

如果枚舉沒有明確的價值觀,給他們一個和使用標誌來定義「分組」:

[Flags] 
enum MySuperEnumGroup 
{ 
    Group1 = 1 << 0, 
    Group2 = 1 << 1, 
    Group3 = 1 << 2, 

    Group1Item1 = 1 << 10 | Group1, 
    Group1Item2 = 1 << 11 | Group1, 
    Group1Item3 = 1 << 12 | Group1, 

    Group2Item1 = 1 << 13 | Group2, 
    Group2Item2 = 1 << 14 | Group2, 
    Group2Item3 = 1 << 15 | Group2, 

    Group3Item1 = 1 << 16 | Group3, 
    Group3Item2 = 1 << 17 | Group3, 
    Group3Item3 = 1 << 18 | Group3, 
} 

然後你可以使用Enum.GetValuesHasFlag得到的值給定的「分組「:

var group1 = Enum.GetValues(typeof(MySuperEnumGroup)) 
       .Cast<MySuperEnumGroup>() 
       .Where(value => value.HasFlag(MySuperEnumGroup.Group1)) 
       .ToArray();