innhyul

Between tomorrow's dream and yesterday's regret is todays opportunity.

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
field.Name就是枚举名字了。那text显示的不太规范。。。。而且还得知道程序集名字,,,,,,

 

我提供一方法,也是用反射

伪代码

 枚举类中定义:
        public enum Gender
        {
            [EnumDescription("男")]
            Male = 0,
            [EnumDescription("女")]
            Female = 1,
        }
  


EnumDescription.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Collections;


namespace SanofiAventis.Ocm.Framework.Common
{
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
    public class EnumDescription : Attribute
    {
        private string enumDisplayText;
        private int enumRank;
        private FieldInfo fieldIno;
      
        public EnumDescription(string enumDisplayText, int enumRank)
        {
            this.enumDisplayText = enumDisplayText;
            this.enumRank = enumRank;
        }

       
        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();

              
        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;
        }
              
        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;
        }
     
        public static EnumDescription[] GetFieldTexts(Type enumType)
        {
            return GetFieldTexts(enumType, SortType.Default);
        }

     
        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
    }
}

 


操作。。。。。

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;

namespace SanofiAventis.Ocm.Framework.Common
{
    public class CustomerUtility
    {
        /// <summary>
        /// 把枚举类型绑定到DropDownList
        /// </summary>
        /// <param name="ddl"></param>
        /// <param name="type"></param>
        /// <param name="Englist"></param>
        public static void BindDropDownList(DropDownList ddl,Type type,bool Englist)
        {
            EnumDescription[] eList = EnumDescription.GetFieldTexts(type);
            foreach (EnumDescription e in eList)
            {
                if (!Englist)
                {
                    ddl.Items.Add(new ListItem(e.EnumDisplayText, e.EnumValue.ToString()));
                }
                else
                {
                    ddl.Items.Add(new ListItem(e.FieldName, e.EnumValue.ToString()));
                }
            }
        }

        /// <summary>
        /// 根据枚举值获取Text
        /// </summary>
        /// <param name="enumType"></param>
        /// <param name="value"></param>
        /// <param name="English"></param>
        /// <returns></returns>
        public static string  GetEnumTextByValue(Type enumType,int value,bool English)
        {
         EnumDescription[] eList = EnumDescription.GetFieldTexts(enumType);
            foreach(EnumDescription e in eList)
            {
                if(e.EnumValue == value)
                {
                    return English ? e.FieldName:e.EnumDisplayText;
                }
            }

            return "";
        }
    }



当然,我这个方法也不是最好的,比如,双语还可以实现,但多语言版就不太好用了。得重写EnumDescription

posted on 2009-11-19 15:35  bufferi  阅读(216)  评论(0编辑  收藏  举报