2014-01-17 20 views
1

我想建立一組枚舉選擇傳遞給另一個方法的參數。讓我們假設你有枚舉,規定如下:使用布爾結果,添加到枚舉作爲參數傳遞?

public enum Foo 
{ 
    x, 
    y, 
    z 
} 

現在,我通過一些複選框選擇要循環,每個指定是否X,Y或Z選擇。

bool allowX = chkBxAllowX.Checked; 
bool allowY = chkBxAllowY.Checked; 
bool allowZ = allowZ.Checked; 

之後,我必須建立的選擇通過爲枚舉類型。我知道我可以通過使用「|」指定多個枚舉值字符,但是如何根據其他值(即上述布爾值?)來做到這一點。所以,如果allowX,添加Foo.x,如果allowY,指定添加Foo.y.如果allowX和allowY,Foo.x和Foo.y.

回答

5

首先,你需要在你的枚舉的默認值(並與FlagsAttribute其標記):

[Flags] 
public enum Foo 
{ 
    NoSelection = 0, 
    X = 1, 
    Y = 2 
    Z = 4 
} 

完成後,您可以使用|=分配來添加基於複選框狀態的標誌。例如

Foo foo = Foo.NoSelection; 

if (allowX) foo |= Foo.X; 
if (allowY) foo |= Foo.Y; 
if (allowZ) foo |= Foo.Z; 

然後,如果您想驗證:

bool allowX = true; 
bool allowY = false; 
bool allowZ = true; 

Foo foo = Foo.NoSelection; 

if (allowX) foo |= Foo.X; 
if (allowY) foo |= Foo.Y; 
if (allowZ) foo |= Foo.Z; 

Console.WriteLine("allowX = {0}", ((foo & Foo.X) == Foo.X) ? "true" : "false"); 
Console.WriteLine("allowY = {0}", ((foo & Foo.Y) == Foo.Y) ? "true" : "false"); 
Console.WriteLine("allowZ = {0}", ((foo & Foo.Z) == Foo.Z) ? "true" : "false"); 
+0

如果您想要將它們組合起來,您仍然需要將您的值定義爲2的冪。就像現在一樣,Z == X&Y –

+0

@MattBurland:的確如此。打字太快了。修正並添加示例。感謝您的反饋。 –

+0

你可以移位它們,這很好: X = 2 << 0,Y = 2 << 1,Z = 2 << 2等等 – astallaslions

0

我知道我可以使用「|」指定多個枚舉值。字符

這將是按位OR操作符,不,不能,不能用你當前的枚舉。由於您沒有明確指定值,因此編譯器會爲您分配順序值。

要使用枚舉作爲位域的每個值必須代表一個特定的組二進制位(比特),即,2。所以權力......

[Flags] 
public enum Foo 
{ 
    None = 0, 
    X = 0x01, 
    Y = 0x02, 
    Z = 0x04 
} 

// ... 
Foo f = Foo.None; 
if (chkBxAllowX.Checked) 
    f |= Foo.X; 
if (chkBxAllowY.Checked) 
    f |= Foo.Y; 
if (chkBxAllowZ.Checked) 
    f |= Foo.Z; 

SomeMethod(f); 

以後可檢查您的權限:

void SomeMethod(Foo f) 
{ 
    if (f.HasFlag(Foo.X)) 
    // or... 
    if ((f & Foo.X) == Foo.X) 
} 
+0

你也應該使用'Flags'屬性。 –

+0

@MattBurland:'[Flags]'只用於漂亮的印刷,但肯定,爲什麼不呢。 –

+1

@EdS。它不僅僅是化妝品。根據[MSDN](http://msdn.microsoft.com/en-us/magazine/cc163568.aspx#S7):*「有趣的是,指定Flags時,Parse和Format方法具有高級功能。 「*另外,其他類可能會查找'FlagsAttribute'來執行額外的邏輯來處理枚舉類型。 – Erik