C# .NET 獲取枚舉值的自定義屬性(特性/注釋/備注)信息


一、引言

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

比如要獲得 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM