Wyobraź mamy ENUM:Konwersja liczbę całkowitą do pudełkowej typu enum znany tylko w czasie wykonywania
enum Foo { A=1,B=2,C=3 }
Jeśli typ jest znany w czasie kompilacji, bezpośredni obsada może być wykorzystana do zmiany pomiędzy enum- Rodzaj i typ bazowy (zazwyczaj int
):
static int GetValue() { return 2; }
...
Foo foo = (Foo)GetValue(); // becomes Foo.B
i boks daje to pole typu Foo
:
object o1 = foo;
Console.WriteLine(o1.GetType().Name); // writes Foo
(i rzeczywiście można Pole jako Foo
i unbox jako int
lub pudełko jako int
i unbox jak Foo
dość szczęśliwie)
Jednak (problem); jeśli typ wyliczeniowy jest znany tylko podczas uruchamiania, rzeczy są ... trudniejsze. Oczywistym jest, że jest to dość banalne, aby zapisać go jako int
- ale czy mogę go ustawić jako Foo
? (Idealnie bez użycia generycznych i MakeGenericMethod
, co byłoby brzydkie). Convert.ChangeType
zgłasza wyjątek. ToString
i Enum.Parse
działa, ale jest strasznie nieskuteczne.
mogłem patrzeć na określonych wartościach (Enum.GetValues
lub Type.GetFields
), ale to jest bardzo trudne dla [Flags]
, a nawet bez wymagałoby wracając do bazowego typu pierwszy (który nie jest tak trudne, na szczęście).
Ale; czy jest bardziej bezpośredni, aby uzyskać od wartości prawidłowego typu bazowego do pola typu enum, gdzie typ jest znany tylko w czasie wykonywania?
W jaki sposób | $ (* i% $ (brakowało mi tego!) Dzięki, to jest dokładnie to, czego chcę –
Łatwo przegapić Wydaje się, że to straszna nazwa metody. Coś takiego jak 'Enum.FromValue' może mieć Było lepiej –