2009-11-02 11 views
6

Wenn ich eine enum habe, die mit [Flags] markiert ist, gibt es eine Möglichkeit in .NET, einen Wert dieses Typs zu testen, um zu sehen, ob es nur einen einzelnen Wert enthält? Ich kann das Ergebnis erhalten, das ich Bit-Zählung verwenden möchte, aber ich würde lieber integrierte Funktionen verwenden, wenn möglich.Einen [Flags] Enum-Wert für einen einzelnen Wert testen

Wenn die Werte enum dynamisch durchlaufen werden, gibt Enum.GetValues() auch die Kombinationsflags zurück. Der Aufruf dieser Funktion auf dem enum im folgenden Beispiel gibt 4 Werte zurück. Ich möchte jedoch nicht den Wert Kombinationen im inneren Algorithmus enthalten. Das Testen der einzelnen enum Werte für die Gleichheit ist out, da die enum möglicherweise viele Werte enthalten kann, und es erfordert auch zusätzliche Wartung, wenn die Werte in der enum ändern.

[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) 
{ 
    // ??? 
}



Verwandte: StackOverflow: Enum.IsDefined on combined flags

Antwort

14

Sie können es auf int gegossen und die Techniken von Bit Twiddling Hacks verwenden zu überprüfen, ob es sich um eine Zweierpotenz ist.

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

+1. Obwohl es definitiv nicht die transparenteste Technik ist, ist es zweifellos die einfachste. –

0

können Sie eine Kombination aus IsDefined verwenden und Überprüfung für Potenzen von 2

+0

In dem Beispiel, das ich schrieb, würde "IsDefined" immer zu "wahr" auswerten. –

-1

Sie könnten Sie Enum.GetValues ​​und zählen nur die Elemente, die eine Potenz von 2 (teilbar durch 2 ohne Rest sind).

Verwandte Themen