簡體   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