C#+Enum 枚举扩展方法获取name,value和Description

本文介绍了一种在C#中实现枚举类型转换的方法,并提供了两种获取枚举Description属性值的具体实现方式。第一种方法通过自定义属性进行转换,第二种方法则通过扩展方法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 public enum ConvertDeliveryCode
        {
         [System.ComponentModel.Description("9980")] 犬山 = 9980,
            [System.ComponentModel.Description("9981")] 关原 = 9981,
            [System.ComponentModel.Description("9982")] 神户 = 9982,
            [System.ComponentModel.Description("9990")] 桶川 = 9990,
            [System.ComponentModel.Description("9991")] 秦野 = 9991,
            [System.ComponentModel.Description("9993")] 东松山 = 9993,
            [System.ComponentModel.Description("9994")] 北九州 = 9994,
            [System.ComponentModel.Description("9996")] 岗山 = 9996,
            [System.ComponentModel.Description("9998")] 名取 = 9998 

        }

第一种方法:

 [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
        public sealed class ConvertEnumDescriptionAttribute : Attribute
        {
            private string description;
            public string Description
            {
                get { return this.description; }
            }

            public ConvertEnumDescriptionAttribute(string description)
                : base()
            {
                this.description = description;
            }
        }
        public static string GetDescription(Enum value)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }
            string description = value.ToString();
            System.Reflection.FieldInfo fieldinfo = value.GetType().GetField(description);
            ConvertEnumDescriptionAttribute[] attributes = (ConvertEnumDescriptionAttribute[])fieldinfo.GetCustomAttributes(typeof(ConvertEnumDescriptionAttribute), false);
            if (attributes != null && attributes.Length > 0)
            {
                description = attributes[0].Description;
            }
            return description;
        }

第二种方法:
/// <summary>
        /// 扩展方法,获得枚举的Description
        /// </summary>
        /// <param name="value">枚举值</param>
        /// <param name="nameInstend">当枚举没有定义DescriptionAttribute,是否用枚举名代替,默认使用</param>
        /// <returns>枚举的Description</returns>
        public static string GetDescription(this Enum value, bool nameInstend = true)
        {
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (name==null)
            {
                return null;
            }            
System.Reflection.FieldInfo field = type.GetField(name);
            
System.ComponentModel.
DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(
System.ComponentModel.
DescriptionAttribute)) as
System.ComponentModel.
DescriptionAttribute;
            if (attribute==null&&nameInstend==true)
            {
                return name;
            }
            return attribute==null? null :attribute.Description;
        }

使用方法:

第一种方法/第二种方法:

GetDescription(ConvertDeliveryCode.犬山)

result:9980
<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、付费专栏及课程。

余额充值