具有相同值的多个枚举

时间:2014-07-30 13:01:28

标签: c# enums flags

我有一组常量,我在C#项目中使用了一个枚举。在某些情况下,我需要在其他情况下只需要一个值,我需要多个值。我开始使用IEnumerable或我的枚举类型的简单数组来处理多个值。但是我最近在属性构造函数中需要多个值来获取多个属性,我想将它们放在类的const字段中。

一个简单的例子:

public enum Browsers {
  Firefox, Chrome, IE, Opera, Safari
}

public class SomeClass {
  [Attr(new Browsers[] { Browsers.Firefox, Browsers.Chrome })]
  public void SomeMethod() { }

  [Attr(new Browsers[] { Browsers.Firefox, Browsers.Chrome })]
  public void SomeOtherMethod() { }
}

我想将浏览器数组重构为类中的字段,但是对于要在属性构造函数中使用的字段,它必须是const字段,并且具有数组初始化的字段不能是const。

然后我尝试在枚举上使用FlagsAttribute,以便枚举可以包含多个值。然后,我可以创建一个字段private const Browsers = Browsers.Firefox | Browsers.Chrome,我很好。在这种情况下。

在我只需要一个值的情况下,应用FlagsAttribute从而允许多个值并不是那么好。在这些情况下,我将始终首先检查枚举只有一个值(我通过检查它是否是2的幂)来做。我发现有点烦人。在一种情况下交易可维护性,在其他情况下维护性较差 - 不理想。

所以我的问题是有一些聪明的方法来解决这个问题吗?我想用FlagsAttribute创建两个单独的枚举,然后一个没有,但是我必须在两个地方而不是一个地保持枚举的所有值。再次不理想。

我是否遗漏了一些可以解决这个问题的方法,这种方式不会影响任何地方的可维护性?

更新 我希望我的代码看起来像这样:

public class SomeClass {
  private const Browsers[] browsers = new Browsers[] { Browsers.Firefox, Browsers.Chrome };

  [Attr(browsers)]
  public void SomeMethod() { }

  [Attr(browsers)]
  public void SomeOtherMethod() { }
}

然而,这会导致编译错误。

我只使用单个值的枚举的地方示例:

public void SomeMethod(Browsers browser) {
  /* When using Flags I need to verify that browser contains only a single value */
  switch(browser)
  {
    case Browsers.Firefox:
      /* do something */
      break;
    case Browsers.Chrome:
      /* do something */
      break;
    /* cases for the rest of the values */
  }

}

我的问题是:我可以以某种方式创建两个具有相同值的枚举,其中一个具有Flags属性而另一个没有它?

奖金问题:我有没有更聪明的方法,我只是没有看到?

1 个答案:

答案 0 :(得分:0)

多个枚举成员可以共享相同的关联值。例子

enum Color 
{
   Red,
   Green,
   Blue,
   Max = Blue
}

显示一个枚举,其中两个枚举成员 - 蓝色和最大 - 具有相同的关联值。