枚举 | 利用DescriptionAttribute定义枚举值的描述信息
2016-06-03 09:58
423 查看
我们知道System.ComponentModel命名空间下有个名为DescriptionAttribute的类用于指定属性或事件的说明,我所调用的枚举值描述信息就是DescriptionAttribute类的Description属性值。
首先定义一个枚举
直接通过GetEnumDescription(ArticleTypeList.csdn)便可获取到“中国软件开发网络”了,对于那些没有定义 DescriptionAttribute的子项则直接返回枚举值,例如 GetEnumDescription(ArticleTypeList.msdn)将返回“msdn”。
思路扩展
虽然使用DescriptionAttribute类基本上也满足了一般需求,可也不排除个别情况下需要多个描述值,针对这种情况,我们可以自System.Attribute类继承编写自定义属性类,例如:
最后编写调用的静态方法:
事例
首先定义一个枚举
/// <summary> /// 测试用的枚举 /// </summary> public enum ArticleTypeList { [DescriptionAttribute("中国软件开发网络")] csdn, msdn, [DescriptionAttribute("博客园")] cnblogs, other }默认情况下我们采用ArticleTypeList.csdn.ToString()的方式只能得到“csdn”,而不是“中国软件开发网络”,为了获取“中国软件开发网络”,我定义了下面这样一个静态方法:
/// <summary> /// 获取枚举类子项描述信息(注意:使用DescriptionAttribute这个类需要引入using System.ComponentModel;这个命名空间,别引错了。) /// </summary> /// <param name="enumSubitem">枚举类子项</param> public static string GetEnumDescription(Enum enumSubitem) { string strValue = enumSubitem.ToString(); FieldInfo fieldinfo = enumSubitem.GetType().GetField(strValue); Object[] objs = fieldinfo.GetCustomAttributes(typeof(DescriptionAttribute), false); if (objs == null || objs.Length == 0) { return strValue; } else { DescriptionAttribute da = (DescriptionAttribute)objs[0]; return da.Description; } }
直接通过GetEnumDescription(ArticleTypeList.csdn)便可获取到“中国软件开发网络”了,对于那些没有定义 DescriptionAttribute的子项则直接返回枚举值,例如 GetEnumDescription(ArticleTypeList.msdn)将返回“msdn”。
思路扩展
虽然使用DescriptionAttribute类基本上也满足了一般需求,可也不排除个别情况下需要多个描述值,针对这种情况,我们可以自System.Attribute类继承编写自定义属性类,例如:
/// <summary> /// 自定义的一个属性类 /// </summary> public class selfAttribute : Attribute { public selfAttribute(string displayText, string displayTest) { m_DisplayText = displayText; m_DisplayTest = displayTest; } private string m_DisplayText = string.Empty; private string m_DisplayTest = string.Empty; public string DisplayText { get { return m_DisplayText; } } public string DisplayTest { get { return m_DisplayTest; } } }然后调整一下ArticleTypeList的代码:
/// <summary> /// 测试用的枚举 /// </summary> public enum ArticleTypeList { [DescriptionAttribute("中国软件开发网络"), selfAttribute("自定义:中国软件开发网络", "http://www.csdn.net")] csdn, [selfAttribute("自定义:MSDN2 Library", "http://msdn2.microsoft.com/zh-cn/library/default.aspx")] msdn, [DescriptionAttribute("博客园")] cnblogs, other }
最后编写调用的静态方法:
/// <summary> /// 获取枚举类子项描述信息 /// </summary> /// <param name="enumSubitem">枚举类子项</param> public static string GetEnumDescription(Enum enumSubitem) { Object obj = GetAttributeClass(enumSubitem, typeof(DescriptionAttribute)); if (obj == null) { return enumSubitem.ToString(); } else { DescriptionAttribute da = (DescriptionAttribute)obj; return da.Description; } } public static void GetselfAttributeInfo(Enum enumSubitem,out string text,out string test) { Object obj = GetAttributeClass(enumSubitem, typeof(selfAttribute)); if (obj == null) { text=test= enumSubitem.ToString(); } else { selfAttribute da = (selfAttribute)obj; text= da.DisplayText; test = da.DisplayTest; } } /// <summary> /// 获取指定属性类的实例 /// </summary> /// <param name="enumSubitem">枚举类子项</param> /// <param name="attributeType">DescriptionAttribute属性类或其自定义属性类 类型,例如:typeof(DescriptionAttribute)</param> private static Object GetAttributeClass(Enum enumSubitem, Type attributeType) { FieldInfo fieldinfo = enumSubitem.GetType().GetField(enumSubitem.ToString()); Object[] objs = fieldinfo.GetCustomAttributes(attributeType, false); if (objs == null || objs.Length == 0) { return null; } return objs[0]; }这样一来,对于DescriptionAttribute类描述信息,调用方法不变,而selfAttribute相关值的调用如下所示:
string text, test; GetselfAttributeInfo(ArticleTypeList.csdn, out text, out test);
事例
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Web; using System.Web.Mvc; namespace WebTest.Controllers { //定义一个枚举类型 public enum AdminUserType { /// <summary> /// 用户类型 /// </summary> [Description("公司职员")] CustomType = 1, /// <summary> /// 审批中 /// </summary> [Description("普工")] CustomTypeGeneralWorkers = 2, /// <summary> /// 已完成 /// </summary> [Description("投资&供应链公司")] CustomTypeInvest = 3, } public class HomeController : Controller { // GET: Home public ActionResult Index() { var des = AdminUserType.CustomType.GetDescription(); //输出“公司职员” return View(); } } //枚举扩展 public static class EnumExtends //注意:使用DescriptionAttribute这个类需要引入using System.ComponentModel;这个命名空间,别引错了。 { //获取枚举元素的描述 public static string GetDescription(this Enum value) { FieldInfo field = value.GetType().GetField(value.ToString()); DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; return attribute == null ? value.ToString() : attribute.Description; } } }
相关文章推荐
- 常见的图像增强方法
- 使用Validator做SpringMVC的验证框架 - Validator前端验证
- passed into methods by value java专题
- PHP 环境变量
- javascript闭包概念简单解析(推荐)
- Highcharts入门
- 关于operator new及placement new,和相关的delete重载
- 新建线程下载apk到sd卡并且安装
- 南洋理工ACM 168房间安排
- 比特币私钥、公钥、钱包地址之间的关系
- jQuery弹出层---artDialog 文档
- Jquery
- 个人总结
- 少年练武术的好处
- HTTP协议头及错误码详解
- Centos使用ntpdate自动更新系统时间
- odoo/openerp 多字段搜索(name_search)
- solrcloud有路由的mapreduce索引程序
- Python re包search函数发现的一个问题
- VS调试C++程序,提示无法启动程序,MSVC\../../bin\caffe.exe系统找不到指定的文件