• 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; }
        }
    }
    
  • 相关阅读:
    【C语言】判断学生成绩等级
    如何强制卸载软件,强制卸载的工具。
    网站添加左下角某易云音乐播放器代码
    ASCII码表
    C语言当中int,float,double,char这四个有什么区别?
    未来HTML5的发展前景如何?黑客专家是这样回答的
    2018年需要关注5个与黑客安全相关趋势
    2025年的技术:为第四次工业革命做准备
    量子计算可以给企业竞争带来的七种优势
    目前投资区块链三大风险
  • 原文地址:https://www.cnblogs.com/wlwjc/p/3578541.html
Copyright © 2020-2023  润新知