我正在尝试构建一组枚举选择以传递给另一个方法的参数。我们假设你有枚举 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,则指定Add Foo.y.如果allowX和allowY,Foo.x和Foo.y。
答案 0 :(得分:5)
首先,您需要在枚举中使用默认值(并使用FlagsAttribute
标记):
[Flags]
public enum Foo
{
NoSelection = 0,
X = 1,
Y = 2
Z = 4
}
完成后,您可以使用|=
分配根据复选框状态添加标记。 e.g。
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");
答案 1 :(得分: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)
}