Перечисление значений в перечислениях с использованием отражения в C # - PullRequest
7 голосов
/ 15 февраля 2011

Я пытаюсь использовать рефлексию для перечисления открытых членов и методов нескольких классов в различных проектах внутри одного решения 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.String).Моя проблема в том, что когда я пытаюсь перечислить перечисления, я получаю вывод на консоль, который выглядит следующим образом:

Namespace.Subspace.event+EVENT_TYPE

Я бы хотел видеть все внутренние значения перечисления вместоего имя.Например, enum

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

Любая помощь, которую может предоставить любой, будет принята с благодарностьюЯ исчерпал все, что смог найти, но свежая перспектива была бы хороша.

Спасибо

Ответы [ 5 ]

13 голосов
/ 15 февраля 2011

Использование System.Enum.GetNames(typeof(EVENT_TYPE)).

вам, вероятно, придется иметь дело с этим особым случаем (без использования отражения для перечислений).

5 голосов
/ 30 сентября 2015

как получить enum и значения через отражение

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()
                  }
              }
         }
    }
3 голосов
/ 15 февраля 2011

Перечисления реализованы как открытые статические поля только для чтения (вероятно, также const); Ваш текущий код должен работать ... Вам просто нужно получить имя из FieldInfo. И вызовите GetValue, если вы хотите значение.

Однако Enum.GetValues ​​(type) проще ...

2 голосов
/ 15 февраля 2011

Таким образом, в вашем случае проверка, является ли source типом enum, а затем вызов GetEnumNames () позволил бы коду воздействовать на классы, перечисления и т. Д.

    private void Work()
    {
        var type = typeof(numbers);

        string [] members;

        if(type.IsEnum)
            members = typeof(numbers).GetEnumNames();
    }

    public enum numbers
    {
        one,
        two,
        three,
    }
0 голосов
/ 09 ноября 2018

Есть способ звонить в несколько строк

public enum TestEnum // in some assembly there is some enum
{

    A = 0,
    B,
    C
}

А потом этот

var assembly = Assembly.Load("TestCS");
var converter = new EnumConverter(assembly.GetType("TestCS.TestEnum"));
var enumValColl = converter.GetStandardValues();

foreach (var val in enumValColl)
    Debug.WriteLine("{0} = {1}", val, (int)val);

Выход

A = 0
B= 1
C = 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...