测试一个[Flags]枚举值是否为单个值

10
如果我有一个标记为[Flags]的枚举,是否有一种方法在.NET中测试此类型的值以查看它是否仅包含单个值?我可以使用位计数获得想要的结果,但如果可能的话,我宁愿使用内置函数。
当动态循环枚举值时,Enum.GetValues()也会返回组合标志。 在下面的示例中在enum上调用该函数将返回4个值,但我不想在内部算法中包括值的组合。 测试单个enum值的相等性是行不通的,因为该enum可能包含多个值,而且当enum中的值更改时还需要额外的维护。
[Flags]
enum MyEnum
{
    One = 1,
    Two = 2,
    Four = 4,
    Seven = One | Two | Four,
}

void MyFunction()
{
    foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum)))
    {
        if (!_HasSingleValue(enumValue)) continue;

        // Guaranteed that enumValue is either One, Two, or Four
    }
}

private bool _HasSingleValue(MyEnum value)
{
    // ???
}



相关问题: StackOverflow: 枚举类型上的 Enum.IsDefined 组合标志

3个回答

20

您可以将其强制转换为int,然后使用位操作技巧来检查它是否是2的幂。

int v = (int)enumValue;
return v != 0 && (v & (v - 1)) == 0;

1
+1。虽然不是最透明的技术,但无疑是最简单的技术。 - Adam Robinson

0

您可以使用IsDefined和检查2的幂次方的组合。


在我写的例子中,IsDefined 会始终评估为 true - Jon Seigel

-1
你可以使用 Enum.GetValues 并仅计算那些是2的幂次方(能够被2整除且没有余数)的项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接