Предположим, что у нас есть перечисление:
enum Foo { A=1,B=2,C=3 }
Если тип известен во время компиляции, прямой трансляции могут использоваться для изменения между типом перечисления и базовым типом (обычно int):
static int GetValue() { return 2; }
...
Foo foo = (Foo)GetValue(); // becomes Foo.B
И бокс дает поле типа Foo:
object o1 = foo;
Console.WriteLine(o1.GetType().Name); // writes Foo
(и действительно, вы можете вставить как Foo и unbox как int, или поле как int и unbox как Foo довольно счастливо)
Однако (проблема); если тип перечисления известен только во время выполнения, вещи... сложнее. Очевидно, тривиально помещать его как int - но могу ли я вставить его как Foo? (В идеале без использования дженериков и MakeGenericMethod, что было бы уродливо). Convert.ChangeType выдает исключение. ToString и Enum.Parse работает, но ужасно неэффективен.
Я мог бы посмотреть на определенные значения (Enum.GetValues или Type.GetFields), но это очень сложно для [Flags], и даже без этого потребуется сначала вернуться к первому типу (что не так сложно, к счастью).
Но; существует ли более прямое значение, чтобы получить значение правильного базового типа в поле типа перечисления, где тип известен только во время выполнения?