Перечисление значений в перечислениях с использованием отражения в C#
Я пытаюсь использовать отражение для списка открытых членов и методов нескольких классов в различных проектах внутри одного решения Visual Studio. Все классы, к которым я пытаюсь получить доступ, являются C#, и все они доступны из класса C#. Код, который я использую для этих вызовов, выглядит следующим образом:
public void PopulateEventParamTree()
{
System.Console.WriteLine(source.GetType().ToString());
Type type = (Type)source.getEventType();
System.Console.WriteLine(type.ToString());
foreach (MemberInfo member in type.GetMembers())
{
System.Console.WriteLine("t" + member.ToString());
}
}
большинство выходов работают нормально (т. е. Int32, Double, System.Строка.) Моя проблема в том, что когда я пытаюсь перечислить перечисления, я получаю вывод на консоль, которая выглядит так это:
Namespace.Subspace.event+EVENT_TYPE
Я хотел бы иметь возможность видеть все внутренние значения перечисления, а не только его имя. Например, перечисление
public enum EVENT_TYPE
{
EVENTDOWN,
EVENTMOVE,
EVENTUP,
}
должно вывести что-то вроде этого
Namespace.Subspace.class+EVENT_TYPE EVENTDOWN
Namespace.Subspace.class+EVENT_TYPE EVENTMOVE
Namespace.Subspace.class+EVENT_TYPE EVENTUP
любая помощь, которую любой может предоставить, будет очень признательна. Я исчерпал все, что смог найти до сих пор, но свежая перспектива была бы хорошей.
спасибо
4 ответов
использовать System.Enum.GetNames(typeof(EVENT_TYPE))
.
вам, вероятно, придется иметь дело с этим особым случаем (не используя отражение для перечислений).
Как получить перечисление и значения через отражение
var importAssembly = System.Reflection.Assembly.LoadFile("test.dll");
Type[] types = importAssembly.GetTypes();
foreach (Type type in types)
{
if (type.IsEnum)
{
var enumName=type.Name;
foreach (var fieldInfo in type.GetFields())
{
if (fieldInfo.FieldType.IsEnum)
{
var fName=fieldInfo.Name;
var fValue=fieldInfo.GetRawConstantValue()
}
}
}
}
перечисления реализованы как общедоступные статические поля только для чтения (возможно, также const); ваш текущий код должен работать... Вам просто нужно получить имя из FieldInfo. И вызовите GetValue если вы хотите значение.
, Перечисление.GetValues (тип) проще...поэтому в вашем случае проверка, является ли source типом перечисления, а затем вызов GetEnumNames () позволит коду действовать на классы, перечисления и т. д.
private void Work()
{
var type = typeof(numbers);
string [] members;
if(type.IsEnum)
members = typeof(numbers).GetEnumNames();
}
public enum numbers
{
one,
two,
three,
}