Achei que isso poderia ser útil para outras pessoas que tropeçaram aqui como eu.
Tenha cuidado ao lidar com quaisquer valores de enumeração que você pode definir para ter um valor == 0 (às vezes pode ser útil ter um estado Desconhecido ou Inativo para uma enumeração). Causa problemas ao confiar nessas operações de manipulação de bits.
Além disso, quando você tem valores de enumeração que são combinações de outra potência de 2 valores, por exemplo,
public enum Colour
{
None = 0, // default value
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16,
Orange = 18 // Combined value of RED and YELLOW
}
Nesses casos, um método de extensão como esse pode 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;
}
E também o método IsSet equivalente que lida com os valores combinados (embora de um jeito meio 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;
}