1. 程式人生 > >C# .NET 獲取列舉值的自定義屬性(特性)資訊

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

原文地址:http://blog.csdn.net/xxj_jing/article/details/8556780