Pensé que esto podría ser útil para otras personas que tropezaron aquí como yo.
Tenga cuidado al manejar cualquier valor de enumeración que pueda establecer para tener un valor == 0 (a veces puede ser útil tener un estado Desconocido o Inactivo para una enumeración). Causa problemas al confiar en estas operaciones de manipulación de bits.
También cuando tiene valores de enumeración que son combinaciones de otra potencia de 2 valores, p. Ej.
public enum Colour
{
None = 0, // default value
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16,
Orange = 18 // Combined value of RED and YELLOW
}
En estos casos, un método de extensión como este podría ser útil:
public static Colour UnSet(this Colour states, Colour state)
{
if ((int)states == 0)
return states;
if (states == state)
return Colour.None;
return states & ~state;
}
Y también el método IsSet equitativo que maneja los valores combinados (aunque de una manera un poco 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;
}