繁体   English   中英

使用布尔结果,添加到枚举作为参数传递?

[英]Using boolean result, add to enum to pass as argument?

我试图建立一组枚举选择,以传递给另一个方法的参数。 假设您有枚举Foo ,如下所示:

public enum Foo
{
   x,
   y,
   z
}

现在,我将遍历一些复选框选择,每个选择指定指定是X,Y还是Z。

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

接下来,我必须建立选择以作为Foo枚举类型传递。 我知道我可以使用“ |”指定多个枚举值 字符,但如何根据其他值(即上述布尔值)执行此操作。 因此,如果使用allowX,则添加Foo.x;如果使用allowY,则指定AddFoo.y。 如果是allowX和allowY,则为Foo.x和Foo.y。

首先,您需要在枚举中使用默认值(并使用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");

我知道我可以使用“ |”指定多个枚举值 字符

那将是按位或运算符,不,您不能,无论如何都不能使用当前的枚举。 由于您没有明确分配值,因此编译器会为您分配顺序值。

要将枚举用作位域,每个值必须表示一组特定的二进制位置(位),即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)
}

暂无
暂无

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

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