2012-12-05 103 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 
    } 
}