提取在C#中的类中声明的枚举类型

时间:2019-02-20 10:07:44

标签: c# enums

我正在尝试提取在类中声明的枚举,这样做:

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一直显示为假。

在调试时,将clarifiedPublicMembers [0]元素转换为System.RuntimeType时,我能够成功检查类型是否为枚举。

但是System.RuntimeType不是公开的,那么如何完成此任务?

enter image description here

2 个答案:

答案 0 :(得分:1)

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是枚举。

  

在调试时,将clarifiedPublicMembers [0]元素转换为System.RuntimeType时,我能够成功检查类型是否为枚举。

     

但是System.RuntimeType不是公共的,那么如何完成此任务?

Type是一个抽象类,由RuntimeType实现(对于Framework-它是Mono中的另一个类)。尽管您会在调试器中看到RuntimeType,但是如果您正在编写代码,则只需使用其基类Type,即可提供所需的一切。

答案 1 :(得分:0)

MemberInfo可以描述类型的不同成员类型。就您而言,您将获得“嵌套类型”。因此,问题是,如何从描述嵌套类型的MemberInfo实例中获取实际类型。您可以通过强制转换为Type来做到这一点,然后检查该类型是否为枚举:

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

但是此代码仅处理嵌套的枚举类型,而不处理字段,属性和方法意义上的枚举成员。为此,请参见Getting the type of a MemberInfo with reflection