• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、引言

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

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap