Думав, що це може бути корисно для інших людей, які натрапили сюди, як я.
Будьте уважні, як ви обробляєте будь-які значення перерахунків, які можуть бути встановлені як значення == 0 (іноді може бути корисним, щоб мати значення невідомого або непрацюючого). Це створює проблеми при покладанні на ці операції маніпуляції бітами.
Також коли у вас є значення перерахунку, що є комбінацією інших значень потужності у 2 значення, наприклад
public enum Colour
{
None = 0, // default value
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16,
Orange = 18 // Combined value of RED and YELLOW
}
У цих випадках може бути корисним такий спосіб розширення:
public static Colour UnSet(this Colour states, Colour state)
{
if ((int)states == 0)
return states;
if (states == state)
return Colour.None;
return states & ~state;
}
А також еквівалентний метод IsSet, який обробляє комбіновані значення (хоч і трохи шалений)
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;
}