2012-12-05 138 views
14

是否可以將多個枚舉組合在一起?下面是我想看到什麼代碼示例:將多個枚舉組合到主枚舉列表中

enum PrimaryColors 
{ 
    Red, 
    Yellow, 
    Blue 
} 

enum SecondaryColors 
{ 
    Orange, 
    Green, 
    Purple 
} 

//Combine them into a new enum somehow to result in: 
enum AllColors 
{ 
    Red, 
    Orange, 
    Yellow, 
    Green, 
    Blue, 
    Purple 
} 

不要緊,他們是什麼樣的順序,或他們的後盾數字,我只是希望能夠把它們結合起來。

對於上下文來說,這使得我正在處理的程序的多個類將具有與他們所做的相關聯的枚舉。我的主程序將讀取每個支持類中提供的所有枚舉,併爲可用命令的可用枚舉創建一個主列表(枚舉用於)。

編輯: 這些枚舉的原因是因爲我的主程序正在讀取命令列表以便在特定時間執行,所以我想要讀取該文件,看看它中的命令是否與一個我的枚舉,如果是,將它放入要執行的命令列表中。

+2

'enum'基本上是一個編譯時的概念。你是否想要生成一個C#文件,其中包含與AllColors類似的定義,或者你是否想要做其他事情? – dasblinkenlight

+0

您是否嘗試以編程方式創建組合類型'AllColors',我的意思是,直到您的應用程序正在運行時才創建它?如果您只是想將它們添加到列表中,請記住所有枚舉都具有'System.Object'和'System.Enum'作爲它們的基類。您可以根據其中一個類創建一些列表。當然,你的枚舉值將被裝箱,但這可能不是問題。 –

+1

爲什麼限制自己'枚舉'? –

回答

3

不知道我是否明白地理解。但是你可以作出這樣所有的值的List<>

var allColors = new List<Enum>(); 

allColors.AddRange(Enum.GetValues(typeof(PrimaryColors)).Cast<Enum>()); 
allColors.AddRange(Enum.GetValues(typeof(SecondaryColors)).Cast<Enum>()); 

相反List<Enum>的,你也可以使用HashSet<Enum>。無論如何,因爲您將PrimaryColorSecondaryColor分配給類別類型(即System.Enum),您會得到boxing,但這只是技術細節(可能)。

+0

順便說一下,'HashSet'在這裏最有可能沒有什麼意義,因爲性能優化。但是如果你使用它來使意圖更清晰,它可能是有意義的。 – svick

+0

當我嘗試它時,此代碼似乎不起作用。在基於此的示例程序中,我得到了以下錯誤:'System.Collections.Generic.List .AddRange(System.Collections.Generic.IEnumerable )'的最佳重載方法匹配'有一些無效參數和參數1:無法從'System.Collections.Generic.IEnumerable '轉換爲'System.Collections.Generic.IEnumerable '' – Xantham

+0

@Xantham抱歉,我再次編輯了我的答案。 –

6

這些枚舉的原因是因爲我的主程序正在讀取命令列表以便在特定時間執行,所以我想在該文件中讀取它,看看它中的命令是否與我的枚舉,如果是的話,把它放到要執行的命令列表中。

這似乎是你不想三種不同類型的enum,你想一個類型(你所謂的「大師enum」),加上一些方法來決定哪些子枚舉的某個值屬於。要做到這一點,您可以使用主枚舉中的值集合或switch

例如:

enum Color 
{ 
    Red, 
    Orange, 
    Yellow, 
    Green, 
    Blue, 
    Purple 
} 

bool IsPrimaryColor(Color color) 
{ 
    switch (color) 
    { 
    case Color.Red: 
    case Color.Yellow: 
    case Color.Blue: 
     return true; 
    default: 
     return false; 
    } 
} 

另外,you should use a singular name for enum types(除非它是一個標誌enum)。

1

保持簡單,只需使用隱式轉換int,或使用System.Enum.Parse()功能:

enum PrimaryColors 
{   
    Red = 0, 
    Yellow = 2, 
    Blue = 4 
} 

enum SecondaryColors 
{ 
    Orange = 1, 
    Green = 3, 
    Purple = 5 
} 

//Combine them into a new enum somehow to result in: 
enum AllColors 
{ 
    Red = 0, 
    Orange, 
    Yellow, 
    Green, 
    Blue, 
    Purple 
} 

class Program 
{ 
    static AllColors ParseColor(Enum color) 
    { 
     return ParseColor(color.ToString()); 
    } 
    static AllColors ParseColor(string color) 
    { 
     return (AllColors)Enum.Parse(typeof(AllColors), color); 
    } 
    static void Main(string[] args) 
    { 
     PrimaryColors color1=PrimaryColors.Red; 
     AllColors result=(AllColors)color1; 
     // AllColors.Red 

     SecondaryColors color2=SecondaryColors.Green; 
     AllColors other=(AllColors)color2; 
     // AllColors.Green 

     AllColors final=ParseColor(PrimaryColors.Yellow); 
     // AllColors.Yellow 
    } 
}