Список всех имен битов из флага Enum

Я пытаюсь сделать вспомогательный метод для вывода списка имен всех битов, установленных в значении Enum (для ведения журнала. цели ). Я хочу иметь метод, который возвращал бы список всех значений Enum, установленных в некоторых переменных. В моем примере

[Flag]
Enum HWResponse
{
   None = 0x0,
   Ready = 0x1,
   Working = 0x2,
   Error = 0x80,
}

я передаю ему 0x81, и он должен предоставить мне IEnumerable<HWResponse>, содержащий {Ready, Error}.

Так как более простого способа я не нашел, я попытался написать приведенный ниже код, но у меня не получается его скомпилировать.

public static IEnumerable<T> MaskToList<T>(Enum mask) 
{
  if (typeof(T).IsSubclassOf(typeof(Enum)) == false)
    throw new ArgumentException();

  List<T> toreturn = new List<T>(100);

  foreach(T curValueBit in Enum.GetValues(typeof (T)).Cast<T>())
  {
    Enum bit = ((Enum) curValueBit);  // Here is the error

    if (mask.HasFlag(bit))
      toreturn.Add(curValueBit);
  }

  return toreturn;
}

В этой версии кода компилятор жалуется, что не может преобразовать T в Enum.

Что я сделал не так? Есть ли лучший (более простой )способ сделать это? Как я мог сделать бросок?

Кроме того, я попытался написать метод как

public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum

, но Enum имеет особый тип, который запрещает синтаксис «где» (Использование C #4.0)

11
задан Oded 11 April 2012 в 18:57
поделиться