Я пытаюсь создать вспомогательный метод для перечисления имен всех битов, заданных в значении 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 имеет особый тип, который запрещает синтаксис "where" (с использованием С# 4.0)