获取Enum枚举值描述的几法方法

原文:获取Enum枚举值描述的几法方法

1.定义枚举时直接用中文

由于VS对中文支持的很不错,所以很多程序员都采用了此方案.

缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用英文

2.利用自定义属性定义枚举值的描述(博客园大尾巴狼

缺点:不适合多语言

原文:http://www.cnblogs.com/hilite/archive/2006/03/28/360793.html

枚举定义:

[EnumDescription("订单、订单中的产品、产品项的状态。")]
 public enum OrderStateEnum
 {
  [EnumDescription("未开始")]
  Ready = 0,
 
  [EnumDescription("进行中")]
  Processing,
 
  [EnumDescription("等待中")]
  Waiting,
 
  [EnumDescription("取消")]
  Canceled,
 
  [EnumDescription("完成")]
  Finished
 }

代码访问:

0、获得枚举类型的文字描述

string txt = EnumDescription.GetEnumText(typeof(OrderStateEnum));

1、获得某个枚举值的文字描述:

string txt = EnumDescription.GetFieldText(OrderStateEnum.Processing)

2、获得枚举中各个字段的定义数组:

EnumDescription[] des = EnumDescription.GetFieldTexts(typeof(OrderStateEnum))

如果需要排序,通过他的另一个重载

public static EnumDescription[] GetFieldTexts( Type enumType, SortType sortType )

3、绑定到下拉框:

comboBox1.DataSource = EnumDescription.GetFieldTexts(typeof(OrderStateEnum));
comboBox1.ValueMember = "EnumValue";
comboBox1.DisplayMember = "EnumDisplayText";
comboBox1.SelectedValue = (int)OrderStateEnum.Finished;  //选中值
 

EnumDisplayText.cs 源码

using System;
using System.Reflection;
using System.Collections;
using System.Text;
 
namespace BirdSof
{
    /// <summary>
    /// 把枚举值按照指定的文本显示
    /// <remarks>
    /// 一般通过枚举值的ToString()可以得到变量的文本,
    /// 但是有时候需要的到与之对应的更充分的文本,
    /// 这个类帮助达到此目的
    /// Date: 2006-3-25 
    /// Author: [email protected]
    /// </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
    }
}

下载地址:原文下载

3.NBear提供的绑定Enum到ASP.NET数据绑定控件的完美解决方案(博客园Teddy

(支持第三方枚举描述,支持二进制与过的枚举值)

原文:http://www.cnblogs.com/teddyma/archive/2007/05/25/759842.html

EnumDescriptionAttribute.cs 源码

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
 
namespace NBear.Common
{
    [AttributeUsage(AttributeTargets.Field, AllowMultiple=false, Inherited=true)]
    public class EnumDescriptionAttribute : Attribute
    {
        private string defaultDesc;
 
        public string DefaultDescription
        {
            get
            {
                return defaultDesc;
            }
            set
            {
                defaultDesc = value;
            }
        }
 
        public virtual string GetDescription(object enumValue)
        {
            Check.Require(enumValue != null, "enumValue could not be null.");
 
            return DefaultDescription ?? enumValue.ToString();
        }
 
        public static string GetDescription(Type enumType, int enumIntValue)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            Dictionary<int, string> descs = EnumDescriptionAttribute.GetDescriptions(enumType);
            Dictionary<int, string>.Enumerator en = descs.GetEnumerator();
            while (en.MoveNext())
            {
                if ((enumIntValue & en.Current.Key) == en.Current.Key)
                {
                    if (sb.Length == 0)
                    {
                        sb.Append(en.Current.Value);
                    }
                    else
                    {
                        sb.Append(‘,‘);
                        sb.Append(en.Current.Value);
                    }
                }
            }
 
            return sb.ToString();
        }
 
        public static Dictionary<int, string> GetDescriptions(Type enumType)
        {
            Check.Require(enumType != null && enumType.IsEnum, "enumType must be an enum type.");
 
            FieldInfo[] fields = enumType.GetFields();
            Dictionary<int, string> descs = new Dictionary<int, string>();
            for (int i = 1; i < fields.Length; ++i)
            {
                object fieldValue = Enum.Parse(enumType, fields[i].Name);
                object[] attrs = fields[i].GetCustomAttributes(true);
                bool findAttr = false;
                foreach (object attr in attrs)
                {
                    if (typeof(EnumDescriptionAttribute).IsAssignableFrom(attr.GetType()))
                    {
                        descs.Add((int)fieldValue, ((EnumDescriptionAttribute)attr).GetDescription(fieldValue));
                        findAttr = true;
                        break;
                    }
                }
                if (!findAttr)
                {
                    descs.Add((int)fieldValue, fieldValue.ToString());
                }
            }
 
            return descs;
        }
    }
}

使用方法:

枚举定义(普通)

public enum SimpleStatus
    {
        [NBear.Common.EnumDescription(DefaultDescription="Desc of Value1")]
        Value1 = 1,
        [NBear.Common.EnumDescription(DefaultDescription="Desc of Value2")]
        Value2 = 2
    }

枚举定义(继承)

public class MyEnumDescriptionAttribute : NBear.Common.EnumDescriptionAttribute
2    {
3        private static string[] customDescs = new string[] { "custom desc of Value1", null };    //the second value is null here to use the DefaultDescription set in enum definition
4
5        public override string GetDescription(object enumValue)
6        {
7            return customDescs[(int)enumValue] ?? base.GetDescription(enumValue);
8        }
9    }

使用EnumDescriptionAttribute以透明获取的枚举值描述信息。

调用EnumDescriptionAttribute.GetDescriptions(enumType)这个静态方法就可以得到指定枚举类型的所有枚举值的由EnumDescriptionAttribute或其继承类标注的描述信息。

【只为参考,引用于 http://www.yaosansi.com/post/1375.html

时间: 2024-10-16 13:57:46

获取Enum枚举值描述的几法方法的相关文章

C#获取存储过程返回值和输出参数值的方法

//转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @b //GO SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString()); conn.Open(); SqlCommand MyCom

JavaScript or jQuery 获取option value值 以及文本内容的方法

1.html <div class="form-group"> <label>保险公司</label> <select class="form-control" id="testSelect"> <option value="平安">平安保险</option> <option value="太平洋">太平洋保险</op

WebApi用Post的方式提交Json时,获取不到值或不进对应方法的问题

又是一个通宵,终于搞明白了. 被WebApi坑得好惨. 之前用各种方法Post上来,有时可以读到结构,但没值,有时直接就是一个Null,有时连方法都没进就跑了,只是来控制器里看了一下…… 最后好友说还是用Json,于是又回去看,最后实验了好久,终于成功了. 首先,用的是 : ApiController 接口,而不是普通的MVCController 其次,方法的命名是这样的: [HttpPost] public Response<string> PostTest([FromBody]JObjec

jquery获取下拉列表的值和显示内容的方法

页面的下拉列表: 选择时间段: <select name="timespan" id="timespan" class="Wdate" > <option value="1">8:00-8:30</option> <option value="2">8:30-9:00</option> <option value="3"&

C#枚举扩展方法,获取枚举值的描述值以及获取一个枚举类下面所有的元素

/// <summary> /// 枚举扩展方法 /// </summary> public static class EnumExtension { private static Dictionary<string, Dictionary<string, string>> _enumCache; /// <summary> /// 缓存 /// </summary> private static Dictionary<stri

.NET获取枚举DescriptionAttribute描述信息性能改进的多种方法

一. DescriptionAttribute的普通使用方式 1.1 使用示例 DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显示,一个简单的枚举定义: public enum EnumGender { None, [System.ComponentModel.Description("男")] Male, [System.ComponentModel.Description("女")] Fem

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

System.ComponentModel命名空间下有个名为DescriptionAttribute的类用于指定属性或事件的说明,我所调用的枚举值描述信息就是DescriptionAttribute类的Description属性值. 首先定义一个枚举 /// <summary>    /// 测试用的枚举    /// </summary>    public enum ArticleTypeList    {        [DescriptionAttribute("

返回枚举值的描述 根据枚举类型返回类型中的所有值、文本及描述

/// <summary> /// 返回枚举值的描述 /// </summary> /// <param name="value">枚举值</param> /// <returns>指定枚举值描述</returns> public static string getEnumDescription(this Enum value) { FieldInfo fi = value.GetType().GetField(v

Enum枚举

Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象. 因此,在比较两个枚举类型的值时,永远不需要调用equals方法,而直接使用"=="就可以了.(equals()方法也是直接使用==,  两者是一样的效果) Java Enum类型的语法结构尽管和java类的语法不一样,应该说差别比较大.但是经过编译器编译之后产生的是一个cla