如果Enum具有特定标志,请检查其是否有其他标志

时间:2014-11-21 21:19:10

标签: c# enums

我有一个名为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个不同的项目,看起来应该比检查所有可能的组合更简单。

2 个答案:

答案 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
}