如果枚举具有特定标志,请检查它是否有任何其他标志

本文关键字:标志 检查 是否 任何 其他 枚举 如果 | 更新日期: 2023-09-27 18:31:30

我有一个相当大的标志枚举,叫做AmendmentType。我需要检查它是否有特定的枚举和任何其他枚举。

例如:

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 个不同的项目,似乎应该有一种比检查所有可能的组合更简单的方法。

如果枚举具有特定标志,请检查它是否有任何其他标志

如果您只对标记为"其他任何内容"的部分感兴趣,则可以使用:

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后缀 - 没有它,阅读代码会容易得多:)

另一种选择是设置标志来表示您感兴趣的组合。

var flagComboA = AmendmentTypeEnum.Item1;
var flagComboB = AmendmentTypeEnum.Item2 | AmendmentTypeEnum.Item6;
if(foo == flagComboA || foo == flagComboB) 
{
     //DO NOT ALLOW
}