c# Enum获取name,value和description

c# Enum获取name,value和description

 

 

如果我们的枚举类型结构如下,我们需要获取enum的name,value以及description

 

public enum EnumTest
    {
        [Description("Attribute")]
        Attribute1 = 1,
        [Description("Attribute")]
        Attribute2 = 2,
        [Description("Measure")]
        Measure1 = 3,
        [Description("Measure")]
        Measure2 = 4
    }

获取的函数代码如下:

 public class EnumHelper
    {

        /// <summary>
        /// get all information of enum,include value,name and description
        /// </summary>
        /// <param name="enumName">the type of enumName</param>
        /// <returns></returns>
        public static List<dynamic> GetAllItems(Type enumName)
        {
            List<dynamic> list = new List<dynamic>();
            // get enum fileds
            FieldInfo[] fields = enumName.GetFields();
            foreach (FieldInfo field in fields)
            {
                if (!field.FieldType.IsEnum)
                {
                    continue;
                }
                // get enum value
                int value = (int)enumName.InvokeMember(field.Name, BindingFlags.GetField, null, null, null);
                string text = field.Name;
                string description = string.Empty;
                object[] array = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
                if (array.Length > 0)
                {
                    description = ((DescriptionAttribute)array[0]).Description;
                }
                else
                {
                    description = ""; //none description,set empty
                }
                //add to list
                dynamic obj = new ExpandoObject();
                obj.Value = value;
                obj.Text = text;
                obj.Description = description;
                list.Add(obj);
            }
            return list;
        }


        /// <summary>
        /// get enum description by name
        /// </summary>
        /// <typeparam name="T">enum type</typeparam>
        /// <param name="enumItemName">the enum name</param>
        /// <returns></returns>
        public static string GetDescriptionByName<T>(T enumItemName)
        {
            FieldInfo fi = enumItemName.GetType().GetField(enumItemName.ToString());

            DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(
                typeof(DescriptionAttribute), false);

            if (attributes != null && attributes.Length > 0)
            {
                return attributes[0].Description;
            }
            else
            {
                return enumItemName.ToString();
            }
        }

    }

 

posted @ 2019-02-11 14:10 波霸38 阅读( ...) 评论( ...) 编辑 收藏
<think>好的,我现在需要帮用户解决在C#获取枚举的Attribute的问题。用户提到了几个引用,我先看看这些引用内容。 引用[1][2]都提到了使用反射来获取DescriptionAttribute。具体来说,引用[1]中的代码片段是object[] objs = enumType.GetField(name).GetCustomAttributes(typeof(DescriptionAttribute), false); 这说明需要先通过枚举类型名称获取对应的FieldInfo,然后调用GetCustomAttributes方法。引用[2]补充说枚举不支持DisplayNameAttribute,所以要用DescriptionAttribute,并建议用扩展方法实现,方便调用。 引用[3]则分几个部分,包括获取字段的Description特性、枚举值的Description特性,以及类中所有字段的Description特性。这可能涉及到类似的反射方法,但具体到枚举,需要处理每个枚举值的字段。 首先,用户的问题是如何在C#获取枚举的Attribute,特别是DescriptionAttribute。我需要整理出步骤: 1. 获取枚举的类型,比如typeof(MyEnum)。 2. 获取具体的枚举值的名称,比如MyEnum.Value1的字符串形式。 3. 使用Type.GetField方法获取该枚举值的FieldInfo。 4. 调用FieldInfo.GetCustomAttributes方法,指定要获取的Attribute类型,这里为DescriptionAttribute。 5. 检查返回的数组是否有元素,如果有,取出DescriptionAttribute的Description属性。 需要注意的地方包括,枚举值作为字段是静态的,所以GetField需要传入枚举值的字符串名称。另外,如果枚举值没有DescriptionAttribute,可能需要处理这种情况,比如返回默认名称。 用户可能还想知道如何封装这个方法,比如作为扩展方法,这样使用起来更方便。引用[2]提到了使用扩展方法,所以应该在静态类中定义一个静态方法,参数带this关键字。 另外,可能需要处理多个Attribute的情况,但通常DescriptionAttribute只允许一个,所以可以安全地取第一个元素。 可能的错误处理包括枚举值为空或者名称不存在,这时候GetField可能返回null,需要处理NullReferenceException,或者在代码中进行检查。 例如,用户传入一个enumValue,需要先获取它的类型名称: var enumType = value.GetType(); var name = Enum.GetName(enumType, value); 然后获取字段: var field = enumType.GetField(name); 接下来获取Attribute: var attributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[]; 如果有的话,返回第一个的Description属性,否则返回name。 将这些步骤写成扩展方法,就可以方便地调用了。 用户可能还会问如何处理其他Attribute,比如DisplayName,但根据引用,枚举不支持DisplayNameAttribute,所以只能使用DescriptionAttribute。 总结,回答需要分步骤说明,给出代码示例,并提到可能的注意事项,比如处理null的情况,或者使用扩展方法提高复用性。同时,根据引用中的信息,确保使用正确的Attribute类型反射方法。</think>### 如何在C#获取枚举的Attribute属性? 在C#中,若需获取枚举值的特性(如 `DescriptionAttribute`),可通过反射机制实现。以下是具体步骤代码示例: --- #### **步骤说明** 1. **获取枚举类型**:通过 `typeof` 关键字或实例的 `GetType()` 方法。 2. **提取枚举字段**:使用 `Type.GetField()` 方法,根据枚举值的名称获取对应的字段信息。 3. **读取特性属性**:通过 `FieldInfo.GetCustomAttributes()` 方法获取绑定的特性列表,并筛选目标特性。 --- #### **代码实现** ```csharp using System; using System.ComponentModel; public static class EnumExtensions { public static string GetDescription(this Enum value) { var enumType = value.GetType(); var name = Enum.GetName(enumType, value); if (name == null) return value.ToString(); var field = enumType.GetField(name); if (field == null) return name; var attributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[]; return attributes?.Length > 0 ? attributes[0].Description : name; } } ``` --- #### **使用示例** 1. **定义带有Description的枚举**: ```csharp public enum Status { [Description("已启用")] Enabled, [Description("已禁用")] Disabled } ``` 2. **调用扩展方法**: ```csharp var status = Status.Enabled; Console.WriteLine(status.GetDescription()); // 输出:已启用 ``` --- #### **注意事项** 1. **依赖 `DescriptionAttribute`**:若未定义该特性,方法会直接返回枚举名称[^2]。 2. **性能优化**:反射操作可能影响性能,建议缓存结果。 3. **空值处理**:若字段不存在或名称为空,默认返回原始枚举值名称。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值