Ich versuche, eine Hilfsmethode für die Auflistung der Namen aller Bits in einem Enum-Wert (für Protokollierungszwecke) zu machen. Ich möchte eine Methode haben, die die Liste aller Enum-Werte in einigen Variablen zurückgeben würde. In meinem BeispielListen Sie alle Bit-Namen von einem Flag Enum
[Flag]
Enum HWResponse
{
None = 0x0,
Ready = 0x1,
Working = 0x2,
Error = 0x80,
}
Ich füttere es 0x81, und es sollte mich sorgen mit einem IEnumerable<HWResponse>
{Ready, Error}
enthält.
Da ich keinen einfacheren Weg gefunden habe, habe ich versucht, den Code unten zu schreiben, aber ich kann es nicht kompilieren lassen.
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;
}
Auf dieser Version des Codes, beschwert sich der Compiler, dass es nicht T Enum werfen können.
Was habe ich falsch gemacht? Gibt es einen besseren (einfacheren) Weg, dies zu tun? Wie könnte ich die Besetzung machen?
Außerdem habe ich versucht, das Verfahren, wie
public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum
aber ENUM ist von einer besonderen Art zu schreiben, die die ‚wo‘ Syntax (C# 4.0)
Dies scheint nicht wie eine Flag Enum sein; Die Kombinationen ergeben keinen Sinn. Kann etwas gleichzeitig "arbeiten" und "fertig" sein? –
@DBM: Das ist wahr, es ist nur ein dummes Beispiel – PPC
@All: Vielen Dank für Ihre tollen Antworten. Alle 3 sind nützlich! – PPC