如果枚举具有特定标志,请检查它是否有任何其他标志
本文关键字:标志 检查 是否 任何 其他 枚举 如果 | 更新日期: 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
}