2010-11-22 56 views
0

我有它接受一個枚舉作爲參數的方法:C#如何檢查一個枚舉值傳遞給參數?

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

我要檢查,如果一個對象包含其在該方法作爲一個參數傳遞的枚舉值中的一個。

回答

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

如果你想確保所有標誌設置,那麼你可以這樣寫:

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

此外,請仔細閱讀@島之風Bråthen如此闡述的響應。爲了[Flags]工作,你需要確保你的枚舉值是2

2

你可以把它寫這樣

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

我改變enumenumParam不與enum關鍵字衝突。

您的實現還存在一個問題,因爲您對A,B,C的值爲1,2,3。這樣你就不能區分A + B = 3和C = 3。 A應該是1,B應在2和C應爲4(d應爲8等)

EDIT

編輯由於OP的評論。

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

對不起,但這不是我的意思。我想檢查一下enumParam的值是否存在於class.myEnum – Martijn 2010-11-22 15:35:40

+0

你的代碼不會被編譯。你需要寫'if((enumParam&MyEnum.A)!= 0)` – 2010-11-22 15:41:52

0

在C#4.0中,您可以輕鬆地使用Enum.HasFlag方法。你可以看看this question以獲得其他解決方案,包括C#3.5和以前的版本。

1
權力

更改枚舉這樣的:

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

和你的方法很簡單,只要:

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

致以問候