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

如何遍历枚举(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:52:36