繁体   English   中英

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

[英]C# How to check an enum value is passed in a parameter?

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

[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);
}

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

作为您的使用标志,这可以帮助您检查是否已设置枚举值: [Flags]枚举属性在C#中是什么意思?

你可以这样写

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);
}

如果要查看参数中传递的任何值是否在类的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;
}

这将对位标志进行逻辑“与”运算,如果在myEnum设置了enum任何标志,则将返回true

如果要确保设置了所有标志,那么可以编写:

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

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

像这样更改您的枚举:

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

并且您的方法很简单:

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

最好的祝福

在C#4.0中,您可以轻松使用Enum.HasFlag方法。 您可以看一下这个问题来获取其他解决方案,包括C#3.5和早期版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM