Wenn Aufzählungen mit Bit-Felder mit:Gibt es eine andere Möglichkeit, Enum-Bitfelder zu testen?
enum ReallyBigEnum { FirstChoice = 0x01, AnotherOption = 0x02 }
ReallyBigEnum flag = ReallyBigEnum.FirstChoice | ReallyBigEnum.AnotherOption;
der Code verwendet, um die Bits zu testen, ist: das Bit getestet zu wiederholen
if((flag & ReallyBigEnum.AnotherOption) == ReallyBigEnum.AnotherOption) { ... }
, die wegen der Notwendigkeit, die ausführliche und fehleranfällig zu sein scheint.
Es wäre schön, wenn es eine Möglichkeit zu sagen, ist:
if(flag.IsSet(ReallyBigEnum.AnotherOption)) { ... }
aber Aufzählungen unterstützen keine Instanzmethoden. Also habe ich versucht, eine Template-Funktion:
class Enums
{
public static bool IsSet<T>(T flag, T bit) { return (flag & bit) == bit; }
}
aber die Code-Bits zu testen, sieht dann wie folgt aus:
if(Enums.IsSet<ReallyBigEnum>(flag, ReallyBigEnum.AnotherOption)) { ... }
, die eine Menge zu schreiben. Dann habe ich versucht, es zu verkürzen:
class Enums
{
public static bool IsSet(int flag, int bit) { return (flag & bit) == bit; }
}
aber dann müssen Sie jeden Wert seinen Basistyp wie diese Stimmen:
if(Enums.IsSet((int)flag, (int)ReallyBigEnum.AnotherOption)) { ... }
die auch ein Schmerz-Code ist und verlieren den Vorteil der Typprüfung .
Die gleiche Funktion könnte geschrieben werden, um 'Objekt' Parameter zu verwenden, aber dann der Objekttyp und zugrunde liegenden Basistyp müsste getestet werden.
Also, ich bin mit dem Standard, redundante Weg an der Spitze stecken.
Hat jemand andere Ideen auf eine saubere, einfache Art, Enum Bitfelder zu testen?
Viel Dank.
Die hasFlag() -Methode ist die perfekte Lösung, natürlich. Vielen Dank! Leider verwendet unsere Entwicklungsumgebung immer noch .NET 2.0. –