Konvertieren einer Ganzzahl in eine Box enum-Typ erst zur Laufzeit bekannt

Sich vorstellen, wir haben eine enum:

enum Foo { A=1,B=2,C=3 }

Wenn der Typ bekannt ist zur compile-Zeit, eine direkte Besetzung kann verwendet werden, um zwischen den enum-Typ und den zugrunde liegenden Typ (in der Regel int):

static int GetValue() { return 2; }
...
Foo foo = (Foo)GetValue(); //becomes Foo.B

- Und Boxen-das gibt ein Feld vom Typ Foo:

object o1 = foo;
Console.WriteLine(o1.GetType().Name); //writes Foo

(und in der Tat, können Sie die box als Foo und unbox als int oder der box als int und unbox als Foo ganz glücklich)

Jedoch (das problem); wenn dem enum-Typ erst zur Laufzeit bekannt ist, die Dinge sind... schwieriger. Es ist offensichtlich trivial box als int - aber kann ich die box als Foo? (Im Idealfall ohne die Verwendung von Generika und MakeGenericMethod, das wäre unschön). Convert.ChangeType eine exception wirft. ToString und Enum.Parse funktioniert, aber ist schrecklich ineffizient.

Konnte ich schaue auf die angegebenen Werte (Enum.GetValues oder Type.GetFields), aber das ist sehr schwer für [Flags], und auch ohne erfordern würde immer wieder zu den zugrunde liegenden Typ der ersten (das ist nicht so schwer, zum Glück).

Aber; gibt es einen direkteren, einen Wert des richtigen zugrunde liegenden Typs zu einem Feld der enum-Typ, wobei der Typ erst zur Laufzeit bekannt ist?

InformationsquelleAutor Marc Gravell | 2010-04-17
Schreibe einen Kommentar