9

如果我有一个enum[Flags]有 的,.NET 中有没有办法测试这种类型的值,看看它是否只包含一个值?我可以使用位计数获得我想要的结果,但如果可能的话,我宁愿使用内置函数。

动态循环enum值时,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 组合标志

4

3 回答 3

20

您可以将其投射到int并使用Bit Twiddling Hacks中的技术来检查它是否是 2 的幂。

int v = (int)enumValue;
return v != 0 && (v & (v - 1)) == 0;
于 2009-11-02T16:04:29.423 回答
0

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

于 2009-11-02T16:04:43.290 回答
-1

您可以 Enum.GetValues 并仅计算那些是 2 的幂的项目(可被 2 整除,没有余数)。

于 2009-11-02T16:05:16.590 回答