Próbuję utworzyć pomocniczą metodę wymieniania nazw wszystkich bitów ustawionych w wartości wyliczenia (do celów rejestrowania). Chcę mieć metodę, która zwróci listę wszystkich wartości enum określonych w niektórych zmiennych. W moim przykładzieLista wszystkich nazw bitów z flagi Enum
[Flag]
Enum HWResponse
{
None = 0x0,
Ready = 0x1,
Working = 0x2,
Error = 0x80,
}
karmię go 0x81 i powinien zapewnić mi z IEnumerable<HWResponse>
zawierający {Ready, Error}
.
Ponieważ nie znalazłem prostszego sposobu, próbowałem napisać poniższy kod, ale nie mogę go skompilować.
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;
}
W tej wersji kodu kompilator skarży się, że nie może rzutować litery T na wyrażenie.
Co zrobiłem źle? Czy istnieje lepszy (prostszy) sposób to zrobić? Jak mogłem wykonać obsadę?
Również próbowałem napisać metodę jako
public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum
ale Enum jest ze specjalnego rodzaju, który zabrania „gdzie” składni (przy użyciu C# 4.0)
To nie wygląda na to, że powinno to być oznaczeniem flagowym; kombinacje nie mają sensu. Czy coś może być "Pracujące" I "Gotowe" w tym samym czasie? –
@DBM: To prawda, to tylko głupi przykład. – PPC
@All: Dziękujemy za wspaniałe odpowiedzi. Wszystkie 3 są przydatne! – PPC