c# - 检查枚举是否包含多个标志

标签 c# enums enum-flags

这个问题在这里已经有了答案:





How do I check if more than one enum flag is set?

(5 个回答)



Test that only a single bit is set in Flags Enum [duplicate]

(1 个回答)


1年前关闭。




我正在尝试检查“枚举实例”是否包含多个标志。

[Flags]
public enum Foo 
{
  Bar = 1,
  Far = 2
}

var multiState = Foo.Bar | Foo.Far;

MoreThanOneFlag(multiState); // True

var singleState = Foo.Bar;

MoreThanOneFlag(singleState); // False


此外,我真的不想使用以下内容:

var state = Foo.Bar | Foo.Far;

Console.WriteLine(state.ToString().Count(x => x == ',') > 0); // True


注意,我不在乎“实例”包含哪些标志,我只想知道是否有多个。

最佳答案

I am trying to check if an "enum instance" contains more than one flag. I do not care which Flags the "instance" contains, I just want to know if there are more than one

Additionally I really don't wanna use something like the following:


 var state = Foo.Bar | Foo.Far;
 Console.WriteLine(state.ToString().Count(x => x == ',') > 0); // True

有很多不同的方法可以完成你想要的,我建议做一些(按位)检查:
 public static bool MoreThanOneFlag<TValue>(TValue flag) where TValue : Enum => (Convert.ToInt32(flag) & (Convert.ToInt32(flag) - 1)) != 0;

在上面的代码块中,我们检查 flag不是 2 的幂,使用 flag & (flag-1)) != 0 进行检查(& 运算符)计算其操作数的按位逻辑与。如果只设置了一个标志,我们假设该值将是 2 的幂,否则它是非 2 的幂。

或者,如果您不想要辅助函数,只需在任何地方执行该检查:
 bool value = (multiState & (multiState -1)) != 0;

有关按位的更多信息,please check out更多在这里。

引用 :

Bitwise and shift operators (C# reference)

关于c# - 检查枚举是否包含多个标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60466268/

相关文章:

c# - 是否有比 Console.ReadKey() 更好的替代方案?

java - 评论主题对象的面向对象设计

java - 通过 JAXB 为枚举提供自定义值序列化

c++ - 枚举类型的命名空间 - 最佳实践

C#:从 KeyEventArgs 的 KeyData 获取按下的正确键

C# Enum Flag - 两种绑定(bind)方式 - enum - class -enum

c# - 为什么存储在 NVARCHAR 列中的值有时会用尾随空格填充?

c# - 如何使用分页方法

c - 如何在 C 中定义枚举标志,而不显式设置每个成员值?

c# - 使用带默认参数的构造函数的自动映射器