繁体   English   中英

如何知道枚举是否有所有标志

[英]How to know if enum has all flags

我试图知道枚举值是否定义了所有标志。 枚举定义如下:

[Flags]
public enum ProgrammingSkills
{
    None = 0,
    CSharp = 1,
    VBNet = 2,
    Java = 4,
    C = 8,
}

无法更改枚举以定义“全部”,因为该枚举是在dll库中定义的。

当然我可以迭代所有枚举值,但有没有更好/更短/更聪明的方法来确定枚举值是否定义了所有值?


编辑:

我希望工作代码甚至枚举更改。

我不知道它是否更好,但它肯定更短,如果您将来修改enum ,它将起作用:

bool result = Enum.GetValues(typeof(ProgrammingSkills))
      .Cast<ProgrammingSkills>()
      .All(enumValue.HasFlag);

您可以执行以下操作:

var hasAll = val == (ProgrammingSkills.CSharp | ProgrammingSkills.VBNet
    | ProgrammingSkills.Java | ProgrammingSkills.C);

或更短,但不太适合维护:

var hasAll = (int)val == 15; // 15 = 1 + 2 + 4 + 8

或以通用方式:

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

您可以测试所有成员:

bool allSet = value & (ProgrammingSkills.CSharp
                    | ProgrammingSkills.VBNet
                    | ProgrammingSkills.Java
                    | ProgrammingSkills.C) != 0;

| 创建一个包含所有可能值的掩码,该值根据value进行测试( & ),包含要测试的枚举。

但这很容易出错并且无法维护。 你可能想要坚持循环。

您可以将枚举转换为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.

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