调用GetProperties()获取枚举属性返回空值,如何修正?
问题分析与解决方案
你调用GetProperties()返回空的核心原因是:枚举的成员本质是静态字段,而非类的属性。Type.GetProperties()方法用于获取类型的公共实例属性,枚举类型本身仅继承自Enum的少量实例属性(如Value、Name),但你要获取的枚举成员(IsNoPo*8、IsPo**等)属于静态字段,因此GetProperties()完全无法识别。
正确实现方式
要获取枚举的所有公开成员,需使用Type.GetFields()方法,并通过绑定标志筛选出目标字段:
// 获取枚举的所有公开静态字段(即枚举成员) var enumMembers = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); Console.WriteLine(enumMembers.Length); // 此时会输出4,对应你的4个枚举成员 // 遍历成员并获取自定义属性 foreach (var member in enumMembers) { // 跳过编译器自动生成的内部字段value__ if (member.Name == "value__") continue; // 获取成员上的LabelCssClass属性 var labelAttr = member.GetCustomAttribute<LabelCssClassAttribute>(); // 获取成员上的Display属性 var displayAttr = member.GetCustomAttribute<DisplayAttribute>(); Console.WriteLine($"成员名:{member.Name},枚举值:{(int)member.GetValue(null)}"); if (displayAttr != null) { Console.WriteLine($"显示名称:{displayAttr.Name}"); } if (labelAttr != null) { Console.WriteLine($"标签样式类:{labelAttr.BadgeColorCalss}"); } Console.WriteLine("---"); }
补充说明
BindingFlags.Public | BindingFlags.Static确保只获取公开的静态字段,也就是枚举的定义成员。- 枚举编译时会自动生成
value__字段,用于存储枚举的数值,需手动跳过该字段。 - 若你需要获取枚举类型本身的自定义属性(如代码中的
ClassPropertyAttribute),原代码enumType.GetCustomAttribute<ClassPropertyAttribute>()的调用是正确的,前提是该属性确实标记在枚举类型上。
内容的提问来源于stack exchange,提问作者gebimaster
相关产品推荐
相关产品推荐

