测试单个值的[Flags]枚举值

Jon*_*gel 8 .net c# enums flags

如果我有一个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)
{
    // ???
}
Run Code Online (Sandbox Code Playgroud)



相关:StackOverflow:组合标志上的Enum.IsDefined

Hen*_*rik 17

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

int v = (int)enumValue;
return v != 0 && (v & (v - 1)) == 0;
Run Code Online (Sandbox Code Playgroud)