2010-07-15 11 views
37

Ich schreibe eine Dienstprogrammfunktion, die eine Ganzzahl aus der Datenbank abruft und eine typisierte Enumeration an die Anwendung zurückgibt. HierKann ich in C# von einem generischen Typ in eine Enumeration umwandeln?

ist, was ich versucht zu tun (man beachte ich in einem Datenlesegerät und Spaltennamen übergeben statt der int in meine wirkliche Funktion):

public static T GetEnum<T>(int enumAsInt) 
{ 
    Type enumType = typeof(T); 

    Enum value = (Enum)Enum.ToObject(enumType, enumAsInt); 
    if (Enum.IsDefined(enumType, value) == false) 
    { 
     throw new NotSupportedException("Unable to convert value from database to the type: " + enumType.ToString()); 
    } 

    return (T)value; 
} 

Aber es wird mich nicht (T)value sagen werfen:

Der Typ 'System.Enum' kann nicht in 'T' konvertiert werden.

Auch ich habe eine ganze Reihe von gemischten Kritiken über die Verwendung von Enum.IsDefined gelesen. Leistungsmäßig klingt es sehr schlecht. Wie kann ich sonst einen gültigen Wert garantieren?

+0

Beachten Sie, dass, wenn der Fall gewesen anders herum, sagen Sie, Sie müssen tun '(Enum) v alue' und du bekommst 'Kann Typ 'T' nicht in 'System.Enum'umwandeln, du könntest einfach eine' As'-Darstellung machen, wie 'Wert als Enum'. – nawfal

+1

Nicht wahr (zumindest in meinem Fall), Sie erhalten das alte 'Der as-Operator muss mit einem Referenz- oder NULL-Typ verwendet werden (' Foo.bar 'ist ein nicht nullbarer Wertetyp) Fehler. – keithl8041

Antwort

58

So:

return (T)(object)value; 
+3

Es wäre besser, zuerst "Wert" als ein "Objekt" zu deklarieren. –

+0

Danke das scheint zu kompilieren. Ich verstehe den Grund für den Fehler dann nicht? Bonuspunkte, wenn Sie im Interesse des Lernens erklären können, warum :) – Justin

+2

Der Compiler erkennt nicht, dass 'T' ein Enum-Typ ist. Soweit es bekannt ist, könnte "T" "DateTime" sein. Daher kann nicht direkt von einem anderen Typ als "Objekt" in "T" gecastet werden. – SLaks

11

ändern diese:

Enum value = (Enum)Enum.ToObject(enumType, enumAsInt); 

dazu:

T value = (T)Enum.ToObject(enumType, enumAsInt); 

und entfernen Sie die Guss :)

Verwandte Themen