Я пытаюсь сделать вспомогательный метод для вывода списка имен всех битов, установленных в значении 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)