C#如何检查枚举值是否在参数中传递?

时间:2010-11-22 15:30:24

标签: c# enums

我有一个接受枚举作为参数的方法:

[Flags]
public enum MyEnum
{
  A = 1,
  B = 2,
  C = 3
}

public class MyClass
{
  public MyEnum myEnum;
}

public bool MyMethod(MyClass class, MyEnum enumParam)
{
  // Here I want to check if object class contains some enum values passed as an argument
  // Something like: if(class.myEnum 'contains-one-of-the-items-of enumParam)
}

public void Test()
{
  Myclass class = new MyClass() { myEnum = MyEnum.A };
  MyMethod(class, MyEnum.A | MyEnum.B);
}

我想检查一个对象是否包含一个作为参数在方法中传递的枚举值。

5 个答案:

答案 0 :(得分:3)

作为使用标志,这可以帮助您检查是否已设置枚举值: What does the [Flags] Enum Attribute mean in C#?

答案 1 :(得分:2)

你可以像这样写

public bool MyMethod(MyClass class, MyEnum enumParam)
{
  if( (enumParam & MyEnum.A) != 0 ){
    ...
  }
  if( (enumParam & MyEnum.B) != 0 ){
    ...
  }
}

我将enum更改为enumParam,与enum关键字不冲突。

您的实施也存在问题,因为A,B,C的值为1,2,3。这样你就无法区分A + B = 3和C = 3。 A应为1,B应为2,C应为4(D应为8,依此类推)

修改

由于OP的评论而编辑。

public bool MyMethod(MyClass class, MyEnum enumParam)
{
  return Enum.IsDefined(typeof(MyEnum), enumParam);
}

答案 2 :(得分:1)

如果您想查看参数中传递的任何值是否在类的myEnum字段中,您可以写:

public bool MyMethod(MyClass class, MyEnum enum)
{
  // Here I want to check if object class contains some enum values passed as an argument
  // Something like: if(class.myEnum 'contains-one-of-the-items-of enum)
  return (this.myEnum & enum) != 0;
}

如果true中的任何一个标志设置在enum中,则会对位标志进行逻辑“与”运算并返回myEnum

如果您想确保 all 设置了标志,那么您可以写:

return (this.myEnum & enum) == this.myEnum;

另外,请仔细阅读@ØyvindBråthen的回复。要使[Flags]起作用,您需要确保枚举值是2的幂。

答案 3 :(得分:1)

像这样更改你的枚举:

public enum MyEnum
    {
        A = 2,
        B = 4,
        C = 8
    }

,你的方法很简单:

public bool MyMethod(MyClass aClass, MyEnum aEnum)
        {
            return (aClass.myEnum & aEnum) != 0;
        }

祝你好运

答案 4 :(得分:0)

在C#4.0中,您可以轻松使用Enum.HasFlag方法。您可以查看this question以获取其他解决方案,包括C#3.5和以前的版本。