Stellen wir eine ENUM haben:eine ganze Zahl in eine geschachtelte Aufzählungstyp Konvertieren nur zur Laufzeit bekannt
enum Foo { A=1,B=2,C=3 }
Wenn der Typ zum Zeitpunkt der Kompilierung bekannt ist, kann eine direkte Besetzung verwendet wird zwischen dem enum- zu ändern Typ und der zugrunde liegende Typ (in der Regel int
):
static int GetValue() { return 2; }
...
Foo foo = (Foo)GetValue(); // becomes Foo.B
und Boxen dies gibt einen Kasten vom Typ Foo
:
object o1 = foo;
Console.WriteLine(o1.GetType().Name); // writes Foo
(und in der Tat, können Sie als Foo
und unbox als int
Feld oder Feld als int
und unbox als Foo
ganz glücklich)
jedoch (das Problem); Wenn der Enum-Typ nur zur Laufzeit bekannt ist, sind die Dinge ... kniffliger. Es ist offensichtlich trivial, es als int
Box - aber kann ich es als Foo
Box? (Idealerweise ohne Generika und MakeGenericMethod
, was hässlich wäre). Convert.ChangeType
löst eine Ausnahme aus. ToString
und Enum.Parse
funktioniert, aber ist schrecklich ineffizient.
ich an den definierten Werten (Enum.GetValues
oder Type.GetFields
) aussehen könnte, aber das ist sehr schwer für [Flags]
, und auch ohne erfordern würde, um den darunter liegenden Typen immer wieder ersten (das ist nicht so schwer, zum Glück).
Aber; Gibt es einen direkteren Zugriff von einem Wert des richtigen zugrunde liegenden Typs auf eine Box des Enum-Typs, wobei der Typ nur zur Laufzeit bekannt ist?
Wie die | $ (* &% $ (habe ich vermisse das! Danke, das ist genau das, was ich will. –
Einfach zu verpassen. Scheint wie eine schreckliche Methode Name. So etwas wie 'Enum.FromValue' haben kann –