Перечисление значений в перечислениях с использованием отражения в 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,
    }