Wenn Sie die Antworten von Prise und Rune weiter ausführen und das Attribut value Ihrer Auswahllistenelemente dem Integer-Wert des Typs Enumeration und nicht dem String-Wert zuordnen möchten, verwenden Sie den folgenden Code:
public static SelectList ToSelectList<T, TU>(T enumObj)
where T : struct
where TU : struct
{
if(!typeof(T).IsEnum) throw new ArgumentException("Enum is required.", "enumObj");
var values = from T e in Enum.GetValues(typeof(T))
select new {
Value = (TU)Convert.ChangeType(e, typeof(TU)),
Text = e.ToString()
};
return new SelectList(values, "Value", "Text", enumObj);
}
Anstatt jeden Aufzählungswert als TEnum-Objekt zu behandeln, können wir ihn als Objekt behandeln und ihn dann in eine Ganzzahl umwandeln, um den unboxed-Wert zu erhalten.
Anmerkung: Ich habe auch eine generische Typbeschränkung hinzugefügt, um die Typen, für die diese Erweiterung verfügbar ist, auf structs (den Basistyp von Enum) zu beschränken, und eine Laufzeit-Typüberprüfung, die sicherstellt, dass die übergebene struct tatsächlich eine Enum ist.
Update 23.10.12: Generischer Typ-Parameter für zugrundeliegenden Typ hinzugefügt und Problem der Nichtkompilierung in .NET 4+ behoben.