我有一个名为AmendmentType
的相当大的Flag枚举。我需要检查一下,如果它有特定的枚举和其他任何内容。
例如:
var foo = AmendmentType.Item1;
if (foo.HasFlag(AmendmentType.Item1) && (ANYTHING ELSE))
{
//DO NOT ALLOW
}
else if (foo.HasFlag(AmendmentType.Item2) && foo.HasFlag(AmendmentType.Item6))
{
//DO NOT ALLOW
}
else
{
//ALLOW
}
这怎么可能? Flag Enum中有大约20个不同的项目,看起来应该比检查所有可能的组合更简单。
答案 0 :(得分:4)
如果您只对标记为“其他任何内容”的部分感兴趣,可以使用:
if (foo.HasFlag(AmendmentTypeEnum.Item1) && (foo & ~AmendmentTypeEnum.Item1) != 0)
或者只是检查它是否与Item1
完全相同:
if (foo.HasFlag(AmendmentTypeEnum.Item1) && foo != AmendmentTypeEnum.Item1)
请注意,检查多个标志的所有的存在只需要一次HasFlag
调用:
else if (foo.HasFlag(AmendmentTypeEnum.Item2 | AmendmentTypeEnum.Item6))
(我还建议删除Enum
后缀 - 如果没有它,读取代码会更容易:)
答案 1 :(得分:0)
另一种选择是设置表示您感兴趣的组合的标志。
var flagComboA = AmendmentTypeEnum.Item1;
var flagComboB = AmendmentTypeEnum.Item2 | AmendmentTypeEnum.Item6;
if(foo == flagComboA || foo == flagComboB)
{
//DO NOT ALLOW
}