2012-01-26 31 views
4

假设我需要在标志和非标志变体中都使用枚举。枚举的标志和非标志变体

  • 选项1:我可以复制的一切:

    enum Color { Red, Blue, Green } 
    
    [Flags] 
    enum Colors { 
        None = 0, 
        Red = 1, 
        Blue = 2, 
        Green = 4 
    } 
    
    // use cases 
    Color currentColor; 
    Colors supportedColors; 
    
  • 选项2:我可以只使用标志变异的一切:

    Colors currentColor; // ugly, since neither "None" nor "Red | Blue" should be valid 
    

我不像以下任何一种:在选项1中,Color.RedColors.Red完全不相关,这可能需要禁止绑定代码。另外,我必须保持两个枚举同步。选项2的缺点是显而易见的。我实际上喜欢的是类似于

enum Colors = Flag set of Color; 

是否有更优雅的解决方案来满足此要求?

+0

您可以请扩展用例吗?你是否曾经需要比较'supportedColors'和'currentColor'? – Oded

+0

@Oded:是的,能够做一些类似'bool currentColorIsSupported =(currentColor And supportedColor <> 0)'是很棒的事情。 – Heinzi

回答

5

我只是简单地使用[Flags]版本的一切,只是确保在一些地方,它只是一个单一的值。您需要做到这一点无论哪种方式,因为即使没有[Flags]以下是有效的:

var flags = (Color)47; // why not 

所以你需要检查Color是一个你期待反正[Flags]只会帮助序列化/解析。

2

选项2唯一可能的缺点是缺少位。如果这是你的问题,标志枚举根本不适合你。相反,使支持的颜色a HashSet<Color>

1

绝对不要做两个名为颜色和颜色(选项1)的枚举。这会让你的代码非常混乱。

除非我失去了一些东西,我不认为选项2是如此丑陋。通常,在运行时将系统参数初始化为默认值“无”是合理的。

2

最近我有同样的问题。通过选项2解决,通过简单检查:

bool IsColorValid(Color color) 
{ 
    return (color != 0 && (color & (color - 1)) == 0); 
}