• 对枚举进行操作


    EnumDescription类代码
    using System;
    using System.Reflection;
    using System.Collections;
    using System.Text;
    
    namespace EnumHelper
    {
        /// <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="enumType">枚举类型</param>
            /// <returns></returns>
            public static int GetEnumValue(Type enumType)
            {
                EnumDescription[] eds = (EnumDescription[])enumType.GetCustomAttributes(typeof(EnumDescription), false);
                if (eds.Length != 1) return 0;
                return eds[0].EnumValue;
            }
    
            /// <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
        }
    }

    获取枚举值列表,EnumProductType是您的枚举类型,可以获取所有枚举值列表:

     foreach (EnumDescription i in EnumDescription.GetFieldTexts(typeof(EnumProductType)))
                    {
                        ListItem listitem = new ListItem(i.EnumDisplayText.ToString(), i.FieldName);
                        list.Add(listitem);
                    }
  • 相关阅读:
    Mysql5.7中子查询时order by与group by合用无效的解决办法
    vue $ref的基本用法
    vue渲染列表时报错Avoid using nonprimitive value as key, use string/number value instead.
    uniapp的微信小程序错误警告(uview项目)Some selectors are not allowed in component wxss, including tag name selectors, ID selectors, and attribute selectors。
    如何在 Linux 中找出最近或今天被修改的文件
    微信小程序uniapp编译后vendor.js文件过大
    随笔目录
    cesium加载百度地图_四大Webgis地图框架的对比选择[转]
    Python import Statement
    WordPress中安装插件需要ftp怎么办?
  • 原文地址:https://www.cnblogs.com/Tpf386/p/12189038.html
Copyright © 2020-2023  润新知