You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:15:22