給枚舉添加自定義屬性


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
    }

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM