2009-11-02 31 views
6

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

当动态循环显示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 on combined flags

回答

14

你可以将它转换为int和使用的技术从Bit Twiddling Hacks,以检查它是否是二的幂。

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

+1。虽然绝对不是最透明的技术,但它无疑是最简单的技术。 – 2009-11-02 16:12:21

0

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

+0

在我写的例子中,“IsDefined”总是评估为“true”。 – 2009-11-02 16:11:52

-1

权力,你可以你Enum.GetValues和计数仅是2(整除电源这些项目由2没有余)。