如何高效获取枚举(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
相关产品推荐
相关产品推荐

