我有一个看起来像这样的枚举:
enum myEnum
{
field1 = 11,
field2 = 12,
field3 = 33
};
在我的代码中,我需要说field1是1,field2是2,field3是3,根据我的变量。这个变量是1或2或3;这是一个int。我可以写一行吗?像下面的东西,但更短......
if(myVar == 1)
SomeMethod(myEnum.field1)
...
谢谢: - )
答案 0 :(得分:7)
(myEnum) Enum.Parse(typeof(myEnum), "field" + myVar);
编辑:想想看,你可能想把它包装在一个try/catch (ArgumentException)
中以防万一{?}}给出的枚举值没有,除非你能保证这个永远不会发生。
另一个编辑:想一想,如果只有三个值,你可以这样做:
myVar
但是,这会将除1或2之外的任何值视为3,但如果这是保证的,那么它应该不是问题。
答案 1 :(得分:3)
如果我理解正确(如果没有,请扩展你的问题,因为它不是很清楚),你想做这样的事情:
private static readonly Dictionary<int, MyEnum> _dict = new Dictionary<int, MyEnum> {
{1, MyEnum.field1},
{2, MyEnum.field2},
{3, MyEnum.field3}
};
public MyEnum GetIt(int val)
{
if (!_dict.ContainsKey(val)) throw new ArgumentException("val");
return _dict[val];
}
答案 2 :(得分:1)
看起来像switch语句会比很多ifs好。
switch (myVar)
{
case 1:
// do stuff
break;
case 2:
// do stuff
break;
case 3:
// do stuff
break;
}
答案 3 :(得分:1)
听起来你正在寻找的是Bitwise Operations。通过将枚举定义为每个值只设置一个位,您可以执行几个有趣的操作,包括我认为您要询问的操作。要定义要使用的枚举,您可以使用以下内容:
[Flags]
enum myEnum :int
{
None = 0,
field1 = (1 << 0), //1 binary: 001
field2 = (1 << 1), //2 010
field3 = (1 << 2), //4 100
anyfield = (1 << 3) -1, // 111
field1or2 = (field1 | field2),// 011
field1or3 = (field1 | field3),// 101
field2or3 = (field2 | field3), 110
}
初始化枚举值的语法是为了便于查看列表,看到确切地设置了一个位并且使用了所有2的幂。要检查多个值,您可以使用:
//set to field2or3
myEnum myvar = myEnum.field2or3;
//add in field1
myvar |= myEnum.field1;
//clear field2
myvar &= myEnum.field2;
//true because field1 is set, even though field2 is not
if ((myvar & myEnum.field1or2) != myEnum.None)
{
//...
}
或
if((myvar & (int)myEnum.field1or2) != 0)
如果myvar是一个int(C#需要显式转换为int,与C ++不同)。逐位操作起初有点棘手,但通过一些练习你应该能够弄明白。
答案 4 :(得分:0)
您是否尝试过使用switch语句而不是if值?尝试使用此代码,该代码假定您在问题中声明了枚举类型。将myVar转换为switch语句中的myEnum类型和“viola!”即时映射!:
var myVar = 11;
switch ((myEnum)myVar)
{
case myEnum.field1:
//Code will hit here.
break;
case myEnum.field2:
break;
case myEnum.field3:
break;
default:
break;
}
答案 5 :(得分:0)
另一种方式(记住使用GetValues时枚举按其值排序):
myEnum blah = (myEnum)Enum.GetValues(typeof(myEnum)).GetValue(myVar - 1);