La manière traditionnelle de faire cela est d'utiliser l' Flags
d'attribut sur un enum
:
[Flags]
public enum Names
{
None = 0,
Susan = 1,
Bob = 2,
Karen = 4
}
Ensuite, vous devriez vérifier pour un nom particulier comme suit:
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;
Logique au niveau du bit combinaisons peuvent être difficiles à retenir, j'ai donc rendre la vie plus facile sur moi-même avec un FlagsHelper
classe*:
// 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));
}
}
Cela me permettrait de réécrire le code ci-dessous:
Names names = Names.Susan | Names.Bob;
bool susanIsIncluded = FlagsHelper.IsSet(names, Names.Susan);
bool karenIsIncluded = FlagsHelper.IsSet(names, Names.Karen);
Remarque, je pourrais ajouter Karen
de l'ensemble en faisant ceci:
FlagsHelper.Set(ref names, Names.Karen);
Et j'ai pu supprimer Susan
d'une manière similaire:
FlagsHelper.Unset(ref names, Names.Susan);
*Comme Porges souligné, un équivalent de l' IsSet
méthode ci-dessus, il existe déjà dans le .NET 4.0: Enum.HasFlag
. L' Set
et Unset
méthodes ne semblent pas avoir d'équivalents, bien que j'aimerais encore dire que cette classe a un certain mérite.
Remarque: l'Utilisation des énumérations est juste le classique de s'attaquer à ce problème. Vous pouvez tout à fait traduire le code ci-dessus pour utiliser les services de renseignements à la place et ça marchera tout aussi bien.