如何遍历枚举(enum)并获取其自定义特性(Attribute)与枚举值?
遍历带自定义特性的枚举并获取特性与值
嘿,我来帮你搞定这个问题!遍历带自定义特性的枚举其实没那么复杂,我给你一步步拆解,附上实用的代码示例,看完你就能直接用。
第一步:定义带自定义特性的枚举
首先咱们得先有一个带自定义特性的枚举对吧?先写一个自定义特性类,比如用来存描述信息的,然后给枚举成员打上这个特性:
// 自定义特性类 public class EnumDescriptionAttribute : Attribute { public string Description { get; } public EnumDescriptionAttribute(string description) { Description = description; } } // 带自定义特性的枚举 public enum UserRole { [EnumDescription("普通用户")] RegularUser, [EnumDescription("管理员")] Admin, [EnumDescription("超级管理员")] SuperAdmin, // 这个成员没加特性,用来测试边界情况 Guest }
第二步:写个通用的特性获取方法
接下来咱们需要一个工具方法,用来从枚举成员里取出对应的自定义特性——毕竟直接用反射有点繁琐,封装成方法复用性更高:
public static class EnumHelper { /// <summary> /// 获取枚举成员的自定义特性 /// </summary> /// <typeparam name="TAttribute">要获取的特性类型</typeparam> /// <param name="enumValue">枚举成员</param> /// <returns>返回特性实例,没有则返回null</returns> public static TAttribute? GetEnumAttribute<TAttribute>(this Enum enumValue) where TAttribute : Attribute { var memberInfo = enumValue.GetType().GetMember(enumValue.ToString()).FirstOrDefault(); return memberInfo?.GetCustomAttribute<TAttribute>(); } }
这里我写成了扩展方法,这样调用起来会更顺手,就像枚举自带的方法一样。
第三步:用foreach遍历枚举并获取特性与值
现在万事俱备,咱们用foreach遍历枚举的所有值,然后逐个获取特性和对应的枚举值:
// 遍历枚举的所有成员 foreach (UserRole role in Enum.GetValues(typeof(UserRole))) { // 获取当前枚举成员的自定义特性 var descriptionAttr = role.GetEnumAttribute<EnumDescriptionAttribute>(); // 输出枚举值、枚举名称和特性内容 Console.WriteLine($"枚举值:{(int)role} | 枚举名称:{role} | 描述:{descriptionAttr?.Description ?? "无描述"}"); }
运行这段代码,输出会是:
枚举值:0 | 枚举名称:RegularUser | 描述:普通用户 枚举值:1 | 枚举名称:Admin | 描述:管理员 枚举值:2 | 枚举名称:SuperAdmin | 描述:超级管理员 枚举值:3 | 枚举名称:Guest | 描述:无描述
额外小技巧:一次性获取所有枚举成员+特性的集合
如果你需要把枚举和特性的对应关系一次性存起来,也可以写个方法直接返回字典或者列表:
public static Dictionary<Enum, TAttribute?> GetAllEnumWithAttributes<TEnum, TAttribute>() where TEnum : Enum where TAttribute : Attribute { var enumValues = Enum.GetValues(typeof(TEnum)).Cast<TEnum>(); return enumValues.ToDictionary( val => val as Enum, val => val.GetEnumAttribute<TAttribute>() ); } // 调用示例 var roleDict = EnumHelper.GetAllEnumWithAttributes<UserRole, EnumDescriptionAttribute>(); foreach (var kvp in roleDict) { Console.WriteLine($"角色:{kvp.Key} | 描述:{kvp.Value?.Description ?? "无"}"); }
这样不管是遍历还是后续使用,都非常方便。
内容的提问来源于stack exchange,提问作者Joseph Cenk
相关产品推荐
相关产品推荐

