Представьте, что у нас есть перечисление:
enum Foo { A=1,B=2,C=3 }
Если тип известен во время компиляции, прямое приведение может использоваться для переключения между типом enum и базовым типом (обычно 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
и распаковать как int
, или пометить как int
и распаковать как Foo
довольно счастливо)
Однако (проблема); если тип enum известен только во время выполнения, все становится сложнее. Очевидно, тривиально пометить его как int
- но можно ли его пометить как Foo
? (В идеале без использования обобщений и MakeGenericMethod
, что было бы некрасиво). Convert.ChangeType
выдает исключение. ToString
и Enum.Parse
работают, но ужасно неэффективны.
Я мог бы посмотреть на определенные значения (Enum.GetValues
или Type.GetFields
), но это очень сложно для [Flags]
, и даже без этого сначала потребуется вернуться к базовому типу (что не так сложно) К счастью).
Но; Есть ли более прямой способ получить значение правильного базового типа в поле типа enum, где этот тип известен только во время выполнения?