[英]How to know if enum has all flags
I'm trying to know if a enum value has defined all flags. 我试图知道枚举值是否定义了所有标志。 The enum is defined as following:
枚举定义如下:
[Flags]
public enum ProgrammingSkills
{
None = 0,
CSharp = 1,
VBNet = 2,
Java = 4,
C = 8,
}
I cannot change the enum to define 'All', because that enum is defined in a dll library. 我无法更改枚举以定义“全部”,因为该枚举是在dll库中定义的。
Of course I can iterate over all enum values, but is there any better/shorter/smarter way to determine if a enum value has defined ALL values? 当然我可以迭代所有枚举值,但有没有更好/更短/更聪明的方法来确定枚举值是否定义了所有值?
EDIT: 编辑:
I would like to have working code even the enum changes. 我希望工作代码甚至枚举更改。
I don't know if it's better but it is definitely shorter and will work if you modify the enum
in the future: 我不知道它是否更好,但它肯定更短,如果您将来修改
enum
,它将起作用:
bool result = Enum.GetValues(typeof(ProgrammingSkills))
.Cast<ProgrammingSkills>()
.All(enumValue.HasFlag);
You could do the following: 您可以执行以下操作:
var hasAll = val == (ProgrammingSkills.CSharp | ProgrammingSkills.VBNet
| ProgrammingSkills.Java | ProgrammingSkills.C);
Or shorter, but not really good for maintenance: 或更短,但不太适合维护:
var hasAll = (int)val == 15; // 15 = 1 + 2 + 4 + 8
Or in a generic way: 或以通用方式:
var hasAll = (int)val == Enum.GetValues(typeof(ProgrammingSkills))
.OfType<ProgrammingSkills>().Sum(v => (int)v);
ProgrammingSkills ps = ProgrammingSkills.None | ProgrammingSkills.CSharp | ProgrammingSkills.VBNet | ProgrammingSkills.Java | ProgrammingSkills.C;
int total = (int)ps;
if (total == 15) return true;//ALL FLAGS THERE
You can test for all members: 您可以测试所有成员:
bool allSet = value & (ProgrammingSkills.CSharp
| ProgrammingSkills.VBNet
| ProgrammingSkills.Java
| ProgrammingSkills.C) != 0;
The |
|
creates a mask containing all possible values, which is tested ( &
) against value
, containing the enum you want to test. 创建一个包含所有可能值的掩码,该值根据
value
进行测试( &
),包含要测试的枚举。
But that is error-prone and isn't really maintainable. 但这很容易出错并且无法维护。 You might want to stick to a loop.
你可能想要坚持循环。
You can cast your enum to int
and check if the value than is 15 (sum of all enum-flags): 您可以将枚举转换为
int
并检查值是否为15(所有枚举标志的总和):
ProgrammingSkills programmingSkills = ProgrammingSkills.CSharp | ProgrammingSkills.VBNet | ProgrammingSkills.Java | ProgrammingSkills.C;
int programmingSkillsValue = (int)programmingSkills;
if(programmingSkillsValue == 15)
{
// All Flags are set
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.