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 }