如何检查是否设置了多个枚举标志?

mci*_*oda 35 c# enums

我只是想知道是否设置了一个枚举标志,而不是哪个.我目前的想法是检查它是否是2的幂.在枚举类型中有更好的方法吗?

[Flags]
enum Foo
{
Flag1 = 0x01,
Flag2 = 0x02,
Flag3 = 0x04,
Flag4 = 0x08,
Flag5 = 0x10,
Flag6 = 0x20,
Flag7 = 0x40,
Flag8 = 0x80
}

private bool ExactlynOneFlagSet(Foo myFoo)
{
  var x = (byte) myFoo;
  return (x != 0) && ((x & (x - 1)) == 0); //Check if a power of 2
}

if(!ExactlynOneFlagSet(Foo myFoo))
{
   //Do something
}
Run Code Online (Sandbox Code Playgroud)

Gui*_*non 62

这是一个Bit操作!

if ((myFoo & (myFoo -1)) != 0) //has more than 1 flag
Run Code Online (Sandbox Code Playgroud)

该语句检查值myFoo是否不是2的幂.或者,反之亦然,声明(myFoo & (myFoo -1)) == 0检查2的幂.这个想法是只有单个标志值将是2的幂.设置多个标志将导致两个值的非幂myFoo.

更多信息可以在类似问题的答案中找到:https://stackoverflow.com/a/1662162/2404788.

有关位操作的更多信息,请访问http://en.wikipedia.org/wiki/Bitwise_operation


its*_*e86 11

private bool ExatlyOneFlagSet(Foo myFoo)
{
  return !myFoo.ToString().Contains(',');
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎很危险,因为它依赖于内部实现细节。 (3认同)

Tho*_*que 8

如果枚举没有定义标记的显式组合,您只需检查该值是否在枚举中定义:

private bool ExactlynOneFlagSet(Foo myFoo)
{
    return Enum.IsDefined(typeof(Foo), myFoo);
}
Run Code Online (Sandbox Code Playgroud)