码迷,mamicode.com
首页 > 其他好文 > 详细

利用DescriptionAttribute定义枚举值的描述信息 z

时间:2014-11-05 22:43:39      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   color   ar   os   使用   

System.ComponentModel命名空间下有个名为DescriptionAttribute的类用于指定属性或事件的说明,我所调用的枚举值描述信息就是DescriptionAttribute类的Description属性值。

    首先定义一个枚举

/// <summary>
bubuko.com,布布扣    /// 测试用的枚举
bubuko.com,布布扣    /// </summary>
bubuko.com,布布扣    public enum ArticleTypeList
bubuko.com,布布扣    {
bubuko.com,布布扣        [DescriptionAttribute("中国软件开发网络")]
bubuko.com,布布扣        csdn,        
bubuko.com,布布扣        msdn,
bubuko.com,布布扣        [DescriptionAttribute("博客园")]
bubuko.com,布布扣        cnblogs,
bubuko.com,布布扣        other
bubuko.com,布布扣    }

    默认情况下我们采用ArticleTypeList.csdn.ToString()的方式只能得到“csdn”,而不是“中国软件开发网络”,为了获取“中国软件开发网络”,我定义了下面这样一个静态方法:

/// <summary>
bubuko.com,布布扣        /// 获取枚举类子项描述信息
bubuko.com,布布扣        /// </summary>
bubuko.com,布布扣        /// <param name="enumSubitem">枚举类子项</param>        
bubuko.com,布布扣        public static string GetEnumDescription(Enum enumSubitem)
bubuko.com,布布扣        {
bubuko.com,布布扣            string strValue = enumSubitem.ToString();
bubuko.com,布布扣
bubuko.com,布布扣            FieldInfo fieldinfo = enumSubitem.GetType().GetField(strValue);
bubuko.com,布布扣            Object[] objs = fieldinfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
bubuko.com,布布扣            if (objs == null || objs.Length == 0)
bubuko.com,布布扣            {
bubuko.com,布布扣                return strValue;
bubuko.com,布布扣            }
bubuko.com,布布扣            else
bubuko.com,布布扣            {
bubuko.com,布布扣                DescriptionAttribute da = (DescriptionAttribute)objs[0];
bubuko.com,布布扣                return da.Description;
bubuko.com,布布扣            }
bubuko.com,布布扣
bubuko.com,布布扣        }

    直接通过GetEnumDescription(ArticleTypeList.csdn)便可获取到“中国软件开发网络”了,对于那些没有定义 DescriptionAttribute的子项则直接返回枚举值,例如 GetEnumDescription(ArticleTypeList.msdn)将返回“msdn”。


思路扩展

    虽然使用DescriptionAttribute类基本上也满足了一般需求,可也不排除个别情况下需要多个描述值,针对这种情况,我们可以自System.Attribute类继承编写自定义属性类,例如:

/// <summary>
bubuko.com,布布扣    /// 自定义的一个属性类
bubuko.com,布布扣    /// </summary>
bubuko.com,布布扣    public class selfAttribute : Attribute
bubuko.com,布布扣    {
bubuko.com,布布扣        public selfAttribute(string displayText, string displayTest)
bubuko.com,布布扣        {            
bubuko.com,布布扣            m_DisplayText = displayText;
bubuko.com,布布扣            m_DisplayTest = displayTest;
bubuko.com,布布扣        }
bubuko.com,布布扣
bubuko.com,布布扣        private string m_DisplayText = string.Empty;
bubuko.com,布布扣        private string m_DisplayTest = string.Empty;
bubuko.com,布布扣        public string DisplayText
bubuko.com,布布扣        {
bubuko.com,布布扣            get return m_DisplayText; }
bubuko.com,布布扣        }
bubuko.com,布布扣
bubuko.com,布布扣        public string DisplayTest
bubuko.com,布布扣        {
bubuko.com,布布扣            get return m_DisplayTest; }
bubuko.com,布布扣        }
bubuko.com,布布扣    }

    然后调整一下ArticleTypeList的代码:

/// <summary>
bubuko.com,布布扣    /// 测试用的枚举
bubuko.com,布布扣    /// </summary>
bubuko.com,布布扣    public enum ArticleTypeList
bubuko.com,布布扣    {
bubuko.com,布布扣        [DescriptionAttribute("中国软件开发网络"), selfAttribute("自定义:中国软件开发网络""http://www.csdn.net")]
bubuko.com,布布扣        csdn,
bubuko.com,布布扣        [selfAttribute("自定义:MSDN2 Library""http://msdn2.microsoft.com/zh-cn/library/default.aspx")]
bubuko.com,布布扣        msdn,
bubuko.com,布布扣        [DescriptionAttribute("博客园")]
bubuko.com,布布扣        cnblogs,
bubuko.com,布布扣        other
bubuko.com,布布扣    }

    最后编写调用的静态方法:

/// <summary>
bubuko.com,布布扣        /// 获取枚举类子项描述信息
bubuko.com,布布扣        /// </summary>
bubuko.com,布布扣        /// <param name="enumSubitem">枚举类子项</param>        
bubuko.com,布布扣        public static string GetEnumDescription(Enum enumSubitem)
bubuko.com,布布扣        {
bubuko.com,布布扣            Object obj = GetAttributeClass(enumSubitem, typeof(DescriptionAttribute));
bubuko.com,布布扣            if (obj == null)
bubuko.com,布布扣            {
bubuko.com,布布扣                return enumSubitem.ToString();
bubuko.com,布布扣            }
bubuko.com,布布扣            else 
bubuko.com,布布扣            {
bubuko.com,布布扣                DescriptionAttribute da = (DescriptionAttribute)obj;
bubuko.com,布布扣                return da.Description;
bubuko.com,布布扣            }
bubuko.com,布布扣        }
bubuko.com,布布扣
bubuko.com,布布扣        public static void GetselfAttributeInfo(Enum enumSubitem,out string text,out string test)
bubuko.com,布布扣        {
bubuko.com,布布扣            Object obj = GetAttributeClass(enumSubitem, typeof(selfAttribute));
bubuko.com,布布扣            if (obj == null)
bubuko.com,布布扣            {
bubuko.com,布布扣                text=test= enumSubitem.ToString();
bubuko.com,布布扣            }
bubuko.com,布布扣            else
bubuko.com,布布扣            {
bubuko.com,布布扣                selfAttribute da = (selfAttribute)obj;
bubuko.com,布布扣                text= da.DisplayText;
bubuko.com,布布扣                test = da.DisplayTest;
bubuko.com,布布扣            }
bubuko.com,布布扣        }
bubuko.com,布布扣
bubuko.com,布布扣        /// <summary>
bubuko.com,布布扣        /// 获取指定属性类的实例
bubuko.com,布布扣        /// </summary>
bubuko.com,布布扣        /// <param name="enumSubitem">枚举类子项</param>
bubuko.com,布布扣        /// <param name="attributeType">DescriptionAttribute属性类或其自定义属性类 类型,例如:typeof(DescriptionAttribute)</param>
bubuko.com,布布扣        private static Object GetAttributeClass(Enum enumSubitem, Type attributeType)
bubuko.com,布布扣        {            
bubuko.com,布布扣            FieldInfo fieldinfo = enumSubitem.GetType().GetField(enumSubitem.ToString());
bubuko.com,布布扣            Object[] objs = fieldinfo.GetCustomAttributes(attributeType, false);
bubuko.com,布布扣            if (objs == null || objs.Length == 0)
bubuko.com,布布扣            {
bubuko.com,布布扣                return null;
bubuko.com,布布扣            }            
bubuko.com,布布扣            return objs[0];            
bubuko.com,布布扣        }
bubuko.com,布布扣

    这样一来,对于DescriptionAttribute类描述信息,调用方法不变,而selfAttribute相关值的调用如下所示:

GetselfAttributeInfo(ArticleTypeList.csdn, out text, out test);
bubuko.com,布布扣

相关源码和工程下载:http://files.cnblogs.com/cncxz/EnumDescription.rar

利用DescriptionAttribute定义枚举值的描述信息 z

标签:des   style   blog   http   io   color   ar   os   使用   

原文地址:http://www.cnblogs.com/zeroone/p/4077356.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!