我正在尝试提取在类中声明的枚举,这样做:
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
不是公开的,那么如何完成此任务?
答案 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。