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


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

        首先定义一个枚举

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

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

    /// <summary>
            /// 获取枚举类子项描述信息
            /// </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相关值的调用如下所示:

    GetselfAttributeInfo(ArticleTypeList.csdn, out text, out test);

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

  • 相关阅读:
    vue框架-基础5-vue-使用第三方ui组件快速开发页面,vuetify
    vue框架-基础4-vue-使用vue-cli工具
    vue框架-基础3-vue-component组件化开发
    vue框架-基础2-vue生命周期
    vue框架-基础1-vue包引入,指令,模板语言
    python apscheduler的使用研究
    Python中Flask框架SQLALCHEMY_ECHO设置
    通过淘宝镜像下载python3.8.3的安装包
    pycharm 报错Connection to Python debugger failed socket closed
    github fork项目,和删除fork项目
  • 原文地址:https://www.cnblogs.com/zeroone/p/4077356.html
Copyright © 2020-2023  润新知