开发者社区> 幕三少> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C# 给枚举类型增加一个备注特性

简介: /// /// 备注特性 /// public class RemarkAttribute : Attribute { /// /// 备注 /// public stri...
+关注继续查看
  /// <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

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C#(十)之枚举类型与结构体
枚举类型基本用法;官方给的C#结构体的特点、基本用法。
45 0
ECS一个月使用体验
我在这篇文章中简要总结了自己一个月内使用云服务器的体会,提出了自己的问题和思考,希望自己能有更多的机会体验阿里云服务器.
231 0
阿里云的下一个十年,云计算驱动制造业
正如喻思成所说,“在未来的十年将是互联网的十年,但并不是互联网公司的十年,而是全世界中国所有互联网企业走向互联网的十年,阿里巴巴所做的每件事情都是提供平台。”诚然,用云计算来驱动新制造,就是阿里云眼中制造业的下一个十年。
2478 0
C# 将一个对象转换为指定类型
原文地址:点击打开链接 适用:普通的对象,并且有默认的无参数构造函数 #region 将一个对象转换为指定类型 /// &lt;summary&gt; /// 将一个对象转换为指定类型 /// &lt;/summary&gt; /// &lt;param name="obj"&gt;待转换的对象&lt;/param&gt;
2995 0
ios中的枚举类型 ios6+
在iOS6和Mac OS 10.8以后Apple引入了两个宏来重新定义这两个枚举类型,实际上是将enum定义和typedef合二为一,并且采用不同的宏来从代码角度来区分。
815 0
泛型类型的协变(covariant)和逆变
官网:http://msdn.microsoft.com/zh-cn/library/dd799517.aspx 原文链接:http://book.51cto.com/art/201112/308570.htm  参考链接:http://www.cnblogs.com/yukaizhao/archive/2011/10/27/xiebian-nibian.html   1.3.4  泛型类型的协变(covariant)和逆变(contravariant) 在.NET 4.0之前的版本中,泛型类型是不支持协变和逆变的,但是委托类型的参数是支持协变和逆变的。
667 0
一个枚举的例子
package cn.itcast; import java.util.Date; public class EnumTest {  public static void main(String[] args) {   WeekDay weekday1 =  WeekDay.MON;   //System.out.println(weekday1.nextDay());   
833 0
+关注
幕三少
熟悉java
285
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载