C# 提取C中类中声明的枚举类型#
我正在尝试提取类中声明的枚举,具体操作如下:C# 提取C中类中声明的枚举类型#,c#,enums,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);
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; }
}
类程序
{
静态void Main(字符串[]参数)
{
变量类型=类型(A);
var declaredPublicMembers=type.GetMembers(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.DeclaredOnly);
var enums=declaredPublicMembers.Where(m=>m.GetType().IsEnum.ToList();
Console.WriteLine();
}
}
公共A类
{
公共枚举测试
{
A.
B
C
}
公共int Num{get;set;}
公共字典Dic{get;set;}
}
但我的伊塞努姆一直在作假
调试时,在将declaredPublicMembers[0]元素转换为System.RuntimeType时,我能够成功地检查该类型是否为枚举
但是System.RuntimeType
不是公共的,那么如何完成这个任务呢
MemberInfo可以描述一个类型的不同成员类型。在您的例子中,您会得到一个“嵌套类型”。所以问题是,如何从描述嵌套类型的
MemberInfo
实例中获取实际类型。您可以通过强制转换为类型
,然后检查该类型是否为枚举:
declaredPublicMembers.Where(m => m.MemberType == MemberTypes.NestedType && ((Type)m).IsEnum)
但这段代码只处理嵌套的枚举类型,而不处理字段、属性和方法意义上的枚举成员。为此,请参见
您希望查找所有声明的成员,其中该成员是类型
(而不是方法、事件、字段等),并且类型
是枚举
调试时,在将declaredPublicMembers[0]元素转换为System.RuntimeType时,我能够成功地检查该类型是否为枚举
但是System.RuntimeType不是公共的,所以如何完成此任务
Type
是一个抽象类,由RuntimeType
实现(对于Framework,它在Mono中是一个不同的类)。虽然您将在调试器中看到RuntimeType
,但如果您正在编写代码,只需使用它的基类Type
,它提供您所需的一切。源代码请以文本形式显示。它是,图像也只是用于显示代码中的调试值,m
是MemberInfo
<因此,code>m.GetType()不会返回成员的类型,而是返回MemberInfo
的类型。MemberInfo
不是枚举,因此.IsEnum
返回false。请CodeCaster
或有人解释这是引用文章的副本吗?枚举不是属性,没有枚举类型的属性,只有声明,这就是我想要的。@Veverke枚举不是a
的成员,您需要GetNestedTypes
而不是GetMembers
:typeof(a).GetNestedTypes()。其中(x=>x.IsEnum)
。
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();