Как получить тип перечисления, если перечисление определено внутри класса?
Адаптировано из кода здесь :
namespace GetEnumReflectionTesting
{
enum Foo { Bar = 5 }
public class MyClass
{
enum Foo { Bar =6}
}
class Program
{
static void Main()
{
// Get the assembly containing the enum - Here it's the one executing
var assembly = Assembly.GetExecutingAssembly();
var enumType = assembly.GetType("GetEnumReflectionTesting.Foo"); //this obtains the GetEnumReflectionTesting.Foo
var enumBarValue = enumType.GetField("Bar").GetValue(null);
Console.WriteLine("{0}|{1}", enumBarValue, (int)enumBarValue);
var enumType2 = assembly.GetType("GetEnumReflectionTesting.MyClass.Foo"); //but instead of GetEnumReflectionTesting.MyClass.Foo, this returns a null!
var enumBarValue2 = enumType2.GetField("Bar").GetValue(null);
Console.WriteLine("{0}|{1}", enumBarValue2, (int)enumBarValue2);
}
}
}
Вот кое-что интересное, enumType
возвращает GetEnumReflectionTesting.Foo
, как и ожидалось, но enumType2
вместо получения GetEnumReflectionTesting.MyClass.Foo
возвращает null
!
Итак, каков надежный способ получить тип перечисления независимо от того, определен он в классе или нет?
Обратите внимание, что в моем сценарии перечисление Foo
определено внутри класс, и я получаю его от стороннего поставщика, который я не могу изменить. Поэтому не предлагайте мне перенести перечисление Foo
за пределы класса.