J'ai pensé que cela pourrait être utile pour d'autres personnes qui ont trébuché ici comme moi.
Faites attention à la manière dont vous gérez les valeurs d'énumération que vous pourriez définir pour avoir une valeur == 0 (il peut parfois être utile d'avoir un état Inconnu ou Inactif pour une énumération). Cela pose des problèmes lors de l'utilisation de ces opérations de manipulation de bits.
Aussi lorsque vous avez des valeurs d'énumération qui sont des combinaisons d'autres puissances de 2 valeurs, par exemple
public enum Colour
{
None = 0, // default value
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16,
Orange = 18 // Combined value of RED and YELLOW
}
Dans ces cas, une méthode d'extension telle que celle-ci peut s'avérer utile:
public static Colour UnSet(this Colour states, Colour state)
{
if ((int)states == 0)
return states;
if (states == state)
return Colour.None;
return states & ~state;
}
Et aussi la méthode IsSet équivilente qui gère les valeurs combinées (bien que de manière un peu hacky)
public static bool IsSet(this Colour states, Colour state)
{
// By default if not OR'd
if (states == state)
return true;
// Combined: One or more bits need to be set
if( state == Colour.Orange )
return 0 != (int)(states & state);
// Non-combined: all bits need to be set
return (states & state) == state;
}