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

如何高效获取枚举(enum)中每个值的数值及其自定义属性

解决方法

你可以直接调用FieldInfo的GetValue()方法获取枚举值,因为枚举的每个命名成员本质上都是编译器生成的public static readonly 字段,静态字段取值时传入null作为实例参数即可,再将返回值强转为目标枚举类型就可以使用。

修正后的示例代码

首先建议给泛型参数TEnum加上类型约束,避免传入非法类型:

where TEnum : struct, Enum

业务逻辑代码修正后如下:

FieldInfo[] fields = typeof(TEnum).GetFields(BindingFlags.Public | BindingFlags.Static);
foreach (FieldInfo field in fields)
{
    CustomAttribute? attribute = field.GetCustomAttribute<CustomAttribute>();
    if (attribute != null)
    {
        // 核心逻辑:静态字段GetValue传null,强转为枚举类型
        TEnum enumValue = (TEnum)field.GetValue(null);
        EnumLookup.Add(attribute.Code, enumValue);
    }
}

效率对比说明

这种实现方式确实比最初的版本性能高很多:

  • 原始方案每次遍历枚举值都要调用GetMember()做一次反射查询,N个枚举值就会触发N次查询
  • 新方案只调用一次GetFields()批量获取所有成员信息,后续只需要遍历读取字段值和属性,反射开销降低非常明显,非常适合做静态的枚举映射缓存场景

如果需要额外获取枚举对应的基础类型数值(比如对应的int值),可以用Convert.ToInt32(enumValue)做转换即可。

内容的提问来源于stack exchange,提问作者Jonathan Wood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:54:01