C# 为单个值测试[Flags]枚举值

C# 为单个值测试[Flags]枚举值,c#,.net,enums,flags,C#,.net,Enums,Flags,如果我有一个用[Flags]标记的enum,在.NET中有没有办法测试这种类型的值,看看它是否只包含一个值?我可以使用位计数得到我想要的结果,但如果可能的话,我宁愿使用内置函数 动态循环通过enum值时,enum.GetValues()也会返回组合标志。在下面的示例中,在enum上调用该函数将返回4个值。但是,我不希望在内部算法中包含值组合。测试单个enum值是否相等是不正确的,因为enum可能包含许多值,并且当enum中的值更改时,还需要额外的维护 [Flags] enum MyEnum {

如果我有一个用
[Flags]
标记的
enum
,在.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)
{
    // ???
}



相关:

您可以将其强制转换为
int
,并使用中的技术检查它是否为2的幂

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

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

您可以枚举.GetValues并仅计算幂为2的项(可被2均匀整除,无余数)。

在我编写的示例中,
IsDefined
的计算结果总是
true
+1。虽然绝对不是最透明的技术,但它无疑是最简单的。