给枚举添加自定义属性

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    }

原文地址:https://www.cnblogs.com/jpfss/p/8990580.html

时间: 2024-11-02 12:34:37

给枚举添加自定义属性的相关文章

Java编程:向枚举添加自定义属性(用for-each循环来打印每种苹果的名称和价格)

package 枚举; //向枚举添加自定义属性 enum Apple { AURORA(10),BELMAC(12),CORTLAND(15),EMPIRE(8),GRAVENSTEIN(11); private int price; //构造方法 Apple(int price) { this.price = price; } int getPrice() { return price; } } public class ApplesEnum { public static void mai

Jquery获取select option动态添加自定义属性值失效

Jquery获取select option动态添加自定义属性值失效 2014/12/31 11:49:19 中国学网转载 编辑:李强 http://www.xue163.com/588880/39096/390963333.html 为了帮助网友解决“Jquery获取select optio”相关的问题,中国学网通过互联网对“Jquery获取select optio”相关的解决方案进行了整理,用户详细问题包括:jqueryselectie9  function GetFenceItemData(

添加自定义属性值及应用

添加自定义属性值: 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <title>无标题文档</title> 6 <script> 7 window.onload = function (){ 8 var aBtn =

dedecms:织梦文章如何添加“自定义属性”标签(sql命令行工具)

dede织梦如何添加“自定义属性”标签“症状” 1.进入后台——系统——SQL命令行工具——运行SQL命令行,添加arcatt表字段: insert into`dede_arcatt`(sortid,att,attname) values(9,'d','症状') 2.添加archives表字段: alter table `dede_archives` modify `flag` set ('h','c','p','f','s','j','a','b','d') default NULL     

JavaScript: 高级技巧: window 对象也可以添加自定义属性

JavaScript: 高级技巧: window 对象也可以添加自定义属性 例如 window.ntName = 'a';例如 window.ntXw = top; 优点是, window 无须等加载完毕, 任何时候都可以调用, 如果是页面元素和变量, 就需要小姐加载完毕才能使用 例如在 lhg: 中 父页面dlg_XXX.ShowDialog(); dlg_XXX.inwin.nt调用父窗口 = window; 子页面alert( window.nt调用父窗口.location.href );

给html元素添加自定义属性,并且用jquery进行筛选

例如有多个div,想要实现类似radio的效果. <div name="teacher" selected="selected">tch1</div> <div name="teacher">tch1</div> <div name="teacher">tch1</div> <div name="student">stu1&

OpenLDAP添加自定义objectClass实现添加自定义属性

最近使用到OpenLDAP,需要集成进系统.但是OpenLDAP本身的模板中,能用的属性太少了,无法满足正常的业务需求,因此需要对条目的属性进行扩展. 确定的思路是新增自定义的objectClass,条目的objectClass添加该objectClass之后就可以合法添加自定义属性了(支持PhpLdapAdmin和ApacheDirectoryStudio等可视化工具) 但是能找到的相关的内容比较少,查到的比较多的也是直接添加schema然后在slapd.conf中引入.在服务器上试了一下(O

React添加自定义属性

使用‘data-’前缀即可,代码举例 render(){ return ( <ul className={css.forUl}> { this.props.todo.map(function(item,index){ return ( <li className={css.forLi} key={index+'s'} data-index={index}> //此处即为添加的自定义属性 <input type="text" onBlur={this.han

图解如何在DC上添加自定义属性类

刚才在群里,看到大家问了个AD 自定义属性的问题,现在我来给大家解答下,大家可能都遇到过这样的场景: 1. 在工作上,需要在人员上增加一些属性,比如:性别.是否婚配.年龄.性取向-.(请忽视) 2. 我们不只想要自定义一些人员属性,还想给组.计算机.其他对象也需要定义一些属性,比如说,这个组是否为领导组.排序排多少位等等 我先来说个真实的例子,我去年在做项目上遇到个需求,XX公司要求在SharePoint 上按照公司.部门优先级做为顺序显示组织结构.部门点开后,里面的人员还要求领导要排在上面,然