一次检查3个枚举值?

时间:2010-07-19 13:34:43

标签: c# enums

我有一个看起来像这样的枚举:

enum myEnum
{
    field1 = 11,
    field2 = 12,
    field3 = 33
};

在我的代码中,我需要说field1是1,field2是2,field3是3,根据我的变量。这个变量是1或2或3;这是一个int。我可以写一行吗?像下面的东西,但更短......

if(myVar == 1)
    SomeMethod(myEnum.field1)
...

谢谢: - )

6 个答案:

答案 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);