我有一组常量,我在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属性而另一个没有它?
奖金问题:我有没有更聪明的方法,我只是没有看到?
答案 0 :(得分:0)
多个枚举成员可以共享相同的关联值。例子
enum Color
{
Red,
Green,
Blue,
Max = Blue
}
显示一个枚举,其中两个枚举成员 - 蓝色和最大 - 具有相同的关联值。