C# .NET 获取枚举值的自定义属性(特性)信息

it2022-05-05  85

一、引言

枚举为我看日常开发的可读性提供的非常好的支持,但是有时我们需要得到枚举值得描述信息或者是注释(备注)信息

比如要获得 TestEmun.aaa 属性值得备注 AAA,比较不方便得到。

    public enum TestEmun     {

      /// AAA       aaa =1,       /// BBB       bbb =2,       /// CCC       ccc =3     }

如果要得到类似的效果,我们就需要修改一下代码了,使用反射很容易得到这个结果。

二、定义特性

using System;

using System.Reflection; namespace Lib.DataModel.SysEnum {   /// <summary>   /// 备注特性   /// </summary>   public class RemarkAttribute : Attribute   {     private string m_remark;     public RemarkAttribute(string remark)     {       this.m_remark = remark;     }     /// <summary>     /// 备注     /// </summary>     public string Remark     {       get { return m_remark; }       set { m_remark = value; }     }     /// <summary>     /// 获取枚举的备注信息     /// </summary>     /// <param name="val">枚举值</param>     /// <returns></returns>     public static string GetEnumRemark(Enum val)     {       Type type = val.GetType();       FieldInfo fd = type.GetField(val.ToString());       if (fd == null)          return string.Empty;       object[] attrs = fd.GetCustomAttributes(typeof(RemarkAttribute), false);       string name = string.Empty;       foreach (RemarkAttribute attr in attrs)       {         name = attr.Remark;       }       return name;     }   }   /// <summary>   /// 枚举扩展类   /// </summary>   public static class EnumExtension   {     /// <summary>     /// 获取枚举的备注信息     /// </summary>     /// <param name="em"></param>     /// <returns></returns>     public static string GetRemark(this Enum em)     {       Type type = em.GetType();       FieldInfo fd = type.GetField(em.ToString());       if (fd == null)         return string.Empty;       object[] attrs = fd.GetCustomAttributes(typeof(RemarkAttribute), false);       string name = string.Empty;       foreach (RemarkAttribute attr in attrs)       {         name = attr.Remark;       }       return name;     }   }

}

三 、测试代码

  public class UnitTest   {     public enum TestEmun     {       [Remark("AAA")]       aaa,       [Remark("BBB")]       bbb,       [Remark("CCC")]       ccc     }     public void GetEnumName()     {       //需要引用 Lib.DataModel.SysEnum 命名空间才可以使用 扩展方法       string name = TestEmun.aaa.GetRemark();       /*        name 值为 AAA        */     }   }

四、扩展

//获取枚举的所有属性名称 var fields = typeof(MyEnum).GetFields(BindingFlags.Static | BindingFlags.Public); foreach (var fi in fields)

    Console.WriteLine(fi.Name);

草青工作室:http://blog.csdn.net/xxj_jing 原文地址:http://blog.csdn.net/xxj_jing/article/details/8556780

转载于:https://www.cnblogs.com/xxj-jing/archive/2013/01/30/2890037.html


最新回复(0)