zoukankan      html  css  js  c++  java
  • 给枚举添加自定义属性

    1.常见的枚举是这样的:

     public enum AwardsType
            {
                World = 1,
                Country = 2,
                Provinces=3,
                School = 4
            };

    如果我们要获取额外的信息,比如 world的中文显示,显然上面的写法是不能满足我们的,自己研究了一下,决定给枚举加上自定义属性。加上自定义属性的枚举如下:

     [EnumDescription("荣誉奖项")]
            public enum AwardsType
            {
                [EnumDescription("世界级")]
                World = 1,
                [EnumDescription("国家级")]
                Country = 2,
                [EnumDescription("省市级")]
                Provinces=3,
                [EnumDescription("校级")]
                School = 4
            };

    注意EnumDescription是自己写的一个类,下面会贴上源码。

    2.代码访问:

    //0、获得枚举类型的文字描述 
    
    string txt = EnumDescription.GetEnumText(typeof(OrderStateEnum));
    
    //1、获得某个枚举值的文字描述: 
    
    string txt = EnumDescription.GetFieldText(OrderStateEnum.Processing)
    
    //2、获得枚举中各个字段的定义数组: 
    
    EnumDescription[] des = EnumDescription.GetFieldTexts(typeof(OrderStateEnum))
    
    //3、如果需要排序,通过他的另一个重载   
    
    public static EnumDescription[] GetFieldTexts( Type enumType, SortType sortType )
    
    //4、绑定到下拉框:
    
      ddlTypeID.DataSource =EnumDescription.GetFieldTexts(typeof(DataHelper.AwardsType));
                ddlTypeID.DataTextField = "EnumDisplayText";
                ddlTypeID.DataValueField = "EnumValue";
                ddlTypeID.DataBind();

    3、EnumDescription源码

        /// <summary>
        /// 把枚举值按照指定的文本显示
        /// <remarks>
        /// 一般通过枚举值的ToString()可以得到变量的文本,
        /// 但是有时候需要的到与之对应的更充分的文本,
        /// 这个类帮助达到此目的
        /// </remarks>
        /// </summary>
        /// <example>
        /// [EnumDescription("中文数字")]
        /// enum MyEnum
        /// {
        ///        [EnumDescription("数字一")]
        ///     One = 1, 
        /// 
        ///        [EnumDescription("数字二")]
        ///        Two, 
        /// 
        ///        [EnumDescription("数字三")]
        ///        Three
        /// }
        /// EnumDescription.GetEnumText(typeof(MyEnum));
        /// EnumDescription.GetFieldText(MyEnum.Two);
        /// EnumDescription.GetFieldTexts(typeof(MyEnum)); 
        /// </example>
        [AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
        public class EnumDescription : Attribute
        {
            private string enumDisplayText;
            private int enumRank;
            private FieldInfo fieldIno;
     
            /// <summary>
            /// 描述枚举值
            /// </summary>
            /// <param name="enumDisplayText">描述内容</param>
            /// <param name="enumRank">排列顺序</param>
            public EnumDescription( string enumDisplayText, int enumRank )
            {
                this.enumDisplayText = enumDisplayText;
                this.enumRank = enumRank;
            }
     
            /// <summary>
            /// 描述枚举值,默认排序为5
            /// </summary>
            /// <param name="enumDisplayText">描述内容</param>
            public EnumDescription( string enumDisplayText )
                : this(enumDisplayText, 5) { }
     
            public string EnumDisplayText
            {
                get { return this.enumDisplayText; }
            }
     
            public int EnumRank
            {
                get { return enumRank; }
            }
     
            public int EnumValue
            {
                get { return (int)fieldIno.GetValue(null); }
            }
     
            public string FieldName
            {
                get { return fieldIno.Name; }
            }
     
            #region  =========================================对枚举描述属性的解释相关函数
     
            /// <summary>
            /// 排序类型
            /// </summary>
            public enum SortType
            {
                /// <summary>
                ///按枚举顺序默认排序
                /// </summary>
                Default,
                /// <summary>
                /// 按描述值排序
                /// </summary>
                DisplayText,
                /// <summary>
                /// 按排序熵
                /// </summary>
                Rank
            }
     
            private static System.Collections.Hashtable cachedEnum = new Hashtable();
     
     
            /// <summary>
            /// 得到对枚举的描述文本
            /// </summary>
            /// <param name="enumType">枚举类型</param>
            /// <returns></returns>
            public static string GetEnumText( Type enumType )
            {
                EnumDescription[] eds = (EnumDescription[])enumType.GetCustomAttributes(typeof(EnumDescription), false);
                if ( eds.Length != 1 ) return string.Empty;
                return eds[0].EnumDisplayText;
            }
     
            /// <summary>
            /// 获得指定枚举类型中,指定值的描述文本。
            /// </summary>
            /// <param name="enumValue">枚举值,不要作任何类型转换</param>
            /// <returns>描述字符串</returns>
            public static string GetFieldText( object enumValue )
            {
                EnumDescription[] descriptions = GetFieldTexts(enumValue.GetType(), SortType.Default);
                foreach ( EnumDescription ed in descriptions )
                {
                    if ( ed.fieldIno.Name == enumValue.ToString() ) return ed.EnumDisplayText;
                }
                return string.Empty;
            }
     
     
            /// <summary>
            /// 得到枚举类型定义的所有文本,按定义的顺序返回
            /// </summary>
            /// <exception cref="NotSupportedException"></exception>
            /// <param name="enumType">枚举类型</param>
            /// <returns>所有定义的文本</returns>
            public static EnumDescription[] GetFieldTexts( Type enumType )
            {
                return GetFieldTexts(enumType, SortType.Default);
            }
     
            /// <summary>
            /// 得到枚举类型定义的所有文本
            /// </summary>
            /// <exception cref="NotSupportedException"></exception>
            /// <param name="enumType">枚举类型</param>
            /// <param name="sortType">指定排序类型</param>
            /// <returns>所有定义的文本</returns>
            public static EnumDescription[] GetFieldTexts( Type enumType, SortType sortType )
            {
                EnumDescription[] descriptions = null;
                //缓存中没有找到,通过反射获得字段的描述信息
                if ( cachedEnum.Contains(enumType.FullName) == false )
                {
                    FieldInfo[] fields = enumType.GetFields();
                    ArrayList edAL = new ArrayList();
                    foreach ( FieldInfo fi in fields )
                    {
                        object[] eds = fi.GetCustomAttributes(typeof(EnumDescription), false);
                        if ( eds.Length != 1 ) continue;
                        ((EnumDescription)eds[0]).fieldIno = fi;
                        edAL.Add(eds[0]);
                    }
     
                    cachedEnum.Add(enumType.FullName, (EnumDescription[])edAL.ToArray(typeof(EnumDescription)));
                }
                descriptions = (EnumDescription[])cachedEnum[enumType.FullName];
                if ( descriptions.Length <= 0 ) throw new NotSupportedException("枚举类型[" + enumType.Name + "]未定义属性EnumValueDescription");
     
                //按指定的属性冒泡排序
                for ( int m = 0; m < descriptions.Length; m++ )
                {
                    //默认就不排序了
                    if ( sortType == SortType.Default ) break;
     
                    for ( int n = m; n < descriptions.Length; n++ )
                    {
                        EnumDescription temp;
                        bool swap = false;
     
                        switch ( sortType )
                        {
                            case SortType.Default:
                                break;
                            case SortType.DisplayText:
                                if ( string.Compare(descriptions[m].EnumDisplayText, descriptions[n].EnumDisplayText) > 0 ) swap = true;
                                break;
                            case SortType.Rank:
                                if ( descriptions[m].EnumRank > descriptions[n].EnumRank ) swap = true;
                                break;
                        }
     
                        if ( swap )
                        {
                            temp = descriptions[m];
                            descriptions[m] = descriptions[n];
                            descriptions[n] = temp;
                        }
                    }
                }
     
                return descriptions;
            }
     
            #endregion
        }
  • 相关阅读:
    014、BOM与DOM对象的应用
    013、BOM对象的应用
    001.JS特效
    开发技巧
    AndroidStudio中使用SVN
    AndroidStudio碰到的各种问题
    Activity的生命周期和启动模式
    03.Java多线程并发库API使用2
    php的memcache和memcached扩展区别
    js:关于IE6/7下new Date(值)输出为NaN的解决方案
  • 原文地址:https://www.cnblogs.com/loui/p/3284686.html
Copyright © 2011-2022 走看看