文章出處

  /// <summary>
    /// 備注特性
    /// </summary>
    public class RemarkAttribute : Attribute
    {
        /// <summary>
        /// 備注
        /// </summary>
        public string Remark { get; set; }

        public RemarkAttribute(string remark)
        {
            this.Remark = remark;
        }
    }
復制代碼
復制代碼
    /// <summary>
    /// 枚舉擴展類
    /// </summary>
    public static class EnumExtension
    {
        /// <summary>
        /// 獲取枚舉的備注信息
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        public static string GetRemark(this Enum value)
        {
            FieldInfo fi = value.GetType().GetField(value.ToString());
            if (fi == null)
            {
                return value.ToString();
            }
            object[] attributes = fi.GetCustomAttributes(typeof(RemarkAttribute), false);
            if (attributes.Length > 0)
            {
                return ((RemarkAttribute)attributes[0]).Remark;
            }
            else
            {
                return value.ToString();
            }
        }

        public static string GetEnumDescription(this Enum value)
        {
            FieldInfo fi = value.GetType().GetField(value.ToString());
            DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (attributes.Length > 0)
            {
                return attributes[0].Description;
            }
            else
            {
                return value.ToString();
            }
        }
    }
復制代碼
復制代碼
            var aaa = UserType.Type1.GetRemark();
var aab = UserType.Type2.GetEnumDescription();


一、引言


枚舉為我看日常開發的可讀性提供的非常好的支持,但是有時我們需要得到枚舉值得描述信息或者是注釋(備注)信息


比如要獲得 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/article/details/8556780

 

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()