Pensé que esto podría ser útil para otras personas que tropezaron aquí como yo.
Tenga cuidado de cómo manejar cualquier valor enum 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 enum que son combinaciones de otras potencias de 2 valores, p.
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 de este tipo puede 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 equivilent que se encarga de los valores combinados (aunque en un poco de una manera 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;
}
pequeña nota: una enumeración bit a bit en C# debe recibir todo el [Banderas] atributo por encima de ella. – Nyerguds
@Nyerguds, ¿podría explicar por qué debería obtener el atributo? – ethane
Ofrece una mejor compatibilidad con IntelliSense durante la depuración, ya que reconoce valores de enum desconocidos como combinaciones de valores existentes. – Nyerguds