EnumDescription

using System;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;

namespace AttributeMeta
{
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
    public class EnumDescription : Attribute
    {

        private FieldInfo fieldInfo;


        public EnumDescription(string text, int rank)
        {
            this.Text = text;
            this.Rank = rank;
        }

        /// <summary>
        /// 描述枚举值,默认排序为5
        /// </summary>
        /// <param name="enumDisplayText">描述内容</param>
        public EnumDescription(string text)
            : this(text, 5) { }

        public string Text { get; set; }
        public int Rank { get; set; }

        public int Value
        {
            get
            {
                return (int)fieldInfo.GetValue(null);
            }
        }
        public string FieldName
        {
            get
            {
                return fieldInfo.Name;
            }
        }

        #region 对枚举描述属性的解释相关函数
        /// <summary>
        /// 排序类型
        /// </summary>
        public enum SortType
        {
            /// <summary>
            ///按枚举顺序默认排序
            /// </summary>
            Default,
            /// <summary>
            /// 按描述值排序
            /// </summary>
            DisplayText,
            /// <summary>
            /// 按排序熵
            /// </summary>
            Rank
        }

        private static 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].Text;
        }

        /// <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.fieldInfo.Name == enumValue.ToString())
                    return ed.Text;
            }
            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]).fieldInfo = 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].Text, descriptions[n].Text) > 0) swap = true;
                            break;
                        case SortType.Rank:
                            if (descriptions[m].Rank > descriptions[n].Rank) swap = true;
                            break;
                    }

                    if (swap)
                    {
                        temp = descriptions[m];
                        descriptions[m] = descriptions[n];
                        descriptions[n] = temp;
                    }
                }
            }
            return descriptions;
        }


        /// <summary>
        /// 获得枚举类型数据的列表
        /// </summary>
        /// <param name="enumType">枚举类型</param>
        /// <returns>Meta 列表</returns>
        public static List<Meta> GetMeta(Type enumType)
        {
            List<Meta> list = new List<Meta>();
            FieldInfo[] fields = enumType.GetFields();
            foreach (FieldInfo fi in fields)
            {
                object[] eds = fi.GetCustomAttributes(typeof(EnumDescription), false);
                if (eds.Length != 1)
                    continue;
                ((EnumDescription)eds[0]).fieldInfo = fi;
                var item = eds[0] as EnumDescription;
                Meta meta = new Meta
                {
                    MetaName = item.FieldName,
                    MetaRank = item.Rank,
                    MetaText = item.Text,
                    MetaValue = item.Value
                };
                list.Add(meta);
            }
            return list;
        }

        /// <summary>
        /// 返回枚举类型数据的哈希表
        /// </summary>
        /// <param name="enumType">枚举类型</param>
        /// <returns>Hashtable</returns>
        public static Hashtable GetMetaTable(Type enumType)
        {
            Hashtable table = new Hashtable();
            FieldInfo[] fields = enumType.GetFields();
            foreach (FieldInfo fi in fields)
            {
                object[] eds = fi.GetCustomAttributes(typeof(EnumDescription), false);
                if (eds.Length != 1)
                    continue;
                ((EnumDescription)eds[0]).fieldInfo = fi;
                var item = eds[0] as EnumDescription;
                table.Add(item.Value, item.Text);
            }
            return table;
        }

        /// <summary>
        /// 根据枚举值获得枚举文本
        /// </summary>
        /// <param name="enumType">枚举类型</param>
        /// <param name="key">枚举值</param>
        /// <returns>Text</returns>
        public static object GetMetaValue(Type enumType, int key)
        {
            object value = null;
            Hashtable table = GetMetaTable(enumType);
            if (table.Count > 0)
            {
                value = table[key];
            }
            return value;
        }


        /// <summary>
        /// 根据枚举文本获得枚举值
        /// </summary>
        /// <param name="enumType">枚举类型</param>
        /// <param name="value">枚举文本</param>
        /// <returns>Value</returns>
        public static object GetMetaKey(Type enumType, string value)
        {
            object key = null;
            Hashtable table = GetMetaTable(enumType);
            if (table.Count > 0)
            {
                foreach (DictionaryEntry de in table)
                {
                    if (de.Value.Equals(value))
                    {
                        key = de.Key;
                    }
                }
            }
            return key;
        }

        #endregion
    }
    public class Meta
    {
        public string MetaName { get; set; }
        public int MetaValue { get; set; }
        public string MetaText { get; set; }
        public int MetaRank { get; set; }
    }
}
原文地址:https://www.cnblogs.com/wlwjc/p/3578541.html