Извлечение перечислимых типов, объявленных в классе в C # - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь извлечь перечисления, объявленные в классах, выполняя:

class Program
{
    static void Main(string[] args)
    {

        var type = typeof(A);
        var declaredPublicMembers = type.GetMembers(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.DeclaredOnly);
        var enums = declaredPublicMembers.Where(m => m.GetType().IsEnum).ToList();

        Console.WriteLine();
    }
}

public class A
{
    public enum eTest
    {
        a,
        b,
        c
    }
    public int Num { get; set; }

    public Dictionary<int,string> Dic { get; set; }
}

, но мой IsEnum продолжает отображать значение false.

Во время отладки, после преобразования объявленного элементаublicPublicMembers [0] вSystem.RuntimeType, я могу успешно проверить, является ли тип перечислением.

Но System.RuntimeType не является общедоступным, так как мне выполнить эту задачу?

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019
var type = typeof(A);
var declaredPublicMembers = type.GetMembers(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.DeclaredOnly);
var enums = declaredPublicMembers.Where(m => m is Type t && t.IsEnum).ToList();

Вы хотите найти все объявленные элементы, где этот элемент является Type (а не методом, событием, полем и т. Д.), А Type является перечислением.

Во время отладки после преобразования элемента ОбъявленныйPublicMembers [0] в System.RuntimeType я могу успешно проверить, является ли тип перечислением.

Но System.RuntimeType не является общедоступным, так какЯ выполняю эту задачу?

Type - это абстрактный класс, который реализуется RuntimeType (для Framework - это другой класс в Mono).Хотя вы увидите RuntimeType в отладчике, если вы пишете код, просто используйте его базовый класс Type, который предоставляет все, что вам нужно.

0 голосов
/ 20 февраля 2019

MemberInfo может описывать различные типы членов типа.В вашем случае вы получаете «вложенный тип».Итак, вопрос в том, как получить фактический тип из экземпляра MemberInfo, описывающего вложенный тип.Вы можете сделать это, приведя к Type, после чего вы можете проверить, является ли этот тип перечислением:

declaredPublicMembers.Where(m => m.MemberType == MemberTypes.NestedType && ((Type)m).IsEnum)

Но этот код обрабатывает только вложенные типы перечисления, а не члены перечисления в смысле полей,свойства и методы.Для этого см. Получение типа MemberInfo с отражением .

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