Der traditionelle Weg, dies zu tun, besteht darin, das Flags
Attribut für Folgendes zu verwenden enum
:
[Flags]
public enum Names
{
None = 0,
Susan = 1,
Bob = 2,
Karen = 4
}
Dann würden Sie wie folgt nach einem bestimmten Namen suchen:
Names names = Names.Susan | Names.Bob;
// evaluates to true
bool susanIsIncluded = (names & Names.Susan) != Names.None;
// evaluates to false
bool karenIsIncluded = (names & Names.Karen) != Names.None;
Logische bitweise Kombinationen können schwer zu merken sein, daher mache ich mir das Leben mit einer FlagsHelper
Klasse * leichter :
// The casts to object in the below code are an unfortunate necessity due to
// C#'s restriction against a where T : Enum constraint. (There are ways around
// this, but they're outside the scope of this simple illustration.)
public static class FlagsHelper
{
public static bool IsSet<T>(T flags, T flag) where T : struct
{
int flagsValue = (int)(object)flags;
int flagValue = (int)(object)flag;
return (flagsValue & flagValue) != 0;
}
public static void Set<T>(ref T flags, T flag) where T : struct
{
int flagsValue = (int)(object)flags;
int flagValue = (int)(object)flag;
flags = (T)(object)(flagsValue | flagValue);
}
public static void Unset<T>(ref T flags, T flag) where T : struct
{
int flagsValue = (int)(object)flags;
int flagValue = (int)(object)flag;
flags = (T)(object)(flagsValue & (~flagValue));
}
}
Dies würde es mir ermöglichen, den obigen Code wie folgt umzuschreiben:
Names names = Names.Susan | Names.Bob;
bool susanIsIncluded = FlagsHelper.IsSet(names, Names.Susan);
bool karenIsIncluded = FlagsHelper.IsSet(names, Names.Karen);
Hinweis: Ich könnte Karen
dem Set auch Folgendes hinzufügen :
FlagsHelper.Set(ref names, Names.Karen);
Und ich könnte Susan
auf ähnliche Weise entfernen :
FlagsHelper.Unset(ref names, Names.Susan);
* Wie Porges hervorhob, IsSet
gibt es in .NET 4.0 bereits ein Äquivalent der oben genannten Methode : Enum.HasFlag
. Die Methoden Set
und Unset
scheinen jedoch keine Entsprechungen zu haben. Daher würde ich immer noch sagen, dass diese Klasse einen gewissen Wert hat.
Hinweis: Die Verwendung von Aufzählungen ist nur die herkömmliche Methode, um dieses Problem zu lösen. Sie können den gesamten obigen Code vollständig übersetzen, um stattdessen Ints zu verwenden, und es wird genauso gut funktionieren.