给枚举添加自定义属性

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    }
复制代码

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    }
复制代码

猜你喜欢

转载自www.cnblogs.com/jpfss/p/8990580.html