美文网首页
枚举帮助类EnumHelper--NetCore3/.Net5

枚举帮助类EnumHelper--NetCore3/.Net5

作者: flyinghat | 来源:发表于2020-12-24 15:48 被阅读0次

返回一个枚举值,该值指示指定枚举的描述名称中存在给定的整数值或其字符串名称,如若不存在则返回指定默认值

        /// <summary>
        /// 返回一个枚举值,该值指示指定枚举的描述名称中存在给定的整数值或其字符串名称,如若不存在则返回指定默认值。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="value"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public static T GetEnumByDescription<T>(string value,T defaultValue) where T : struct, Enum
        {
            var list = GetEnumItems2<T>();
            var m = list.FirstOrDefault(i => i.Description == value);
            if (m == null)
            {
                return defaultValue;
            }
            return m.Enum;
        }
        public static List<EnumItem2<T>> GetEnumItems2<T>() where T : struct, Enum
        {
            List<EnumItem2<T>> itemList = new List<EnumItem2<T>>();
            foreach (var v in Enum.GetValues<T>())
            {
                EnumItem2<T> item = new EnumItem2<T>();
                item.EnumKey = Convert.ToInt32(v);
                item.EnumValue = v.ToString();
                item.Description = GetDescription(v);
                item.Enum = v;
                itemList.Add(item);
            }
            return itemList;
        }
        public class EnumItem2<T>
        {
            public int EnumKey { get; set; }
            public string EnumValue { get; set; }
            public string Description { get; set; }
            public T Enum { get; set; }
        }

枚举转换下拉选项
SelectListItem 需要安装Microsoft.AspNetCore.Mvc.ViewFeatures并引用Microsoft.AspNetCore.Mvc.Rendering

       /// <summary>
       /// 返回Razor可识别的下拉框集合
       /// </summary>
       /// <param name="enumType"></param>
       /// <param name="selectValue"></param>
       /// <param name="removes"></param>
       /// <returns></returns>
        public static IList<SelectListItem> ToSelectList(Type enumType, int selectValue, params int[] removes)
        {
            IList<SelectListItem> listItem = new List<SelectListItem>();
            if (enumType.IsEnum)
            {
                Array values = Enum.GetValues(enumType);
                if (values.Length > 0)
                {
                    foreach (int item in values)
                    {
                        if (removes.Length > 0)
                        {
                            if (removes.Contains(item))
                            {
                                continue;
                            }
                        }

                        var test = System.Enum.GetName(enumType, item);
                        FieldInfo fi = enumType.GetField(test);
                        var dna = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute));
                        if (dna != null && !string.IsNullOrEmpty(dna.Description))
                        {
                            test = dna.Description;
                        }
                        listItem.Add(new SelectListItem { Value = item.ToString(), Text = test, Selected = selectValue == item });
                    }
                }
            }
            else
            {
                throw new ArgumentException("请传入正确的枚举!");
            }
            return listItem;
        }

获取枚举描述信息

        /// <summary>
        /// 获取描述信息
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string GetDescription(this Enum obj)
        {
            if (obj == null)
            {
                return string.Empty;
            }
            try
            {
                Type enumType = obj.GetType();
                FieldInfo fi = enumType.GetField(System.Enum.GetName(enumType, obj));
                var dna = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute));
                if (dna != null && string.IsNullOrEmpty(dna.Description) == false)
                    return dna.Description;
            }
            catch
            {
                return string.Empty;
            }
            return obj.ToString();
        }

双属性描述设置

    /// <summary>
    /// 枚举双描述属性
    /// </summary>
    public class BaseDescriptionAttribute : DescriptionAttribute
    {
        public BaseDescriptionAttribute(string description1)   : base(description1)   {    }
        public BaseDescriptionAttribute(string description1, string description2)   : base(description1)
        {
            this.Description2 = description2;
        }
        public string Description2 { get; set; }
    }

双属性使用

 public enum AccessStatus
    {
        [BaseDescription("正常", "正常")]
        Normal,
    }

获取双属性描述信息

        /// <summary>
        /// 双属性扩展方法,获得枚举的Description
        /// </summary>
        /// <param name="value">枚举值</param>
        /// <param name="nameInstead">当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用</param>
        /// <returns>枚举的Description</returns>
        public static EnumItem GetBaseDescription(this Enum value, bool nameInstead = true)
        {
            EnumItem e = new EnumItem();
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (name == null)
            {
                return null;
            }
            FieldInfo field = type.GetField(name);
            BaseDescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(BaseDescriptionAttribute)) as BaseDescriptionAttribute;
            if (attribute == null && nameInstead == true)
            {
                e.Description1 = name;
                e.Description2 = name;
                return e;
            }
            else
            {
                e.Description1 = attribute.Description;
                e.Description2 = attribute.Description2;
                return e;
            }

        }
   public class EnumItem
    {
        public int EnumKey { get; set; }
        public string EnumValue { get; set; }
        public string Description1 { get; set; }
        public string Description2 { get; set; }
    }
        /// <summary>
        /// 获取枚举的相关信息
        /// </summary>
        /// <param name="e">枚举的类型</param>
        /// <returns></returns>
        public static List<EnumItem> GetBaseEnumItems(Type e)
        {
            List<EnumItem> itemList = new List<EnumItem>();
            foreach (Enum v in Enum.GetValues(e))
            {
                EnumItem item = new EnumItem();
                item.EnumKey = Convert.ToInt32(v);
                item.EnumValue = v.ToString();
                item.Description1 = GetBaseDescription(v).Description1;
                item.Description2 = GetBaseDescription(v).Description2;
                itemList.Add(item);
            }
            return itemList;

        }

相关文章

  • 枚举帮助类EnumHelper--NetCore3/.Net5

    返回一个枚举值,该值指示指定枚举的描述名称中存在给定的整数值或其字符串名称,如若不存在则返回指定默认值 枚举转换下...

  • MongoDB Java基本操作

    示例包含2个类文件, 1个操作枚举,1个帮助类. Maven 引用 枚举 帮助类 使用示例

  • Java基础15:深入剖析Java枚举类

    本文介绍了枚举类的基本概念,使用方法,以及底层实现原理。帮助你更好地使用枚举类并且理解枚举类的内部实现细节。 具体...

  • Scala中的枚举

    与java不同,scala并没有提供枚举类型,而是通过Enumeration类的帮助来实现枚举功能的。 使用方法 ...

  • 枚举

    如何定义枚举类 什么枚举类:类里的对象是有限个,可以枚举出来 如何使用enum定义枚举类 枚举...

  • Java篇-枚举的使用

    一 : 自定义枚举类 枚举类调用 二 : 使用enum关键字定义枚举类 让枚举类实现接口: 可以让不同的枚举类的对...

  • 枚举--java24(02/17/2016)

    如何自定义枚举类如何使用enum定义枚举类、枚举类的主要方法实现接口的枚举类 JDK1.5之前需要自定义枚举类JD...

  • java enum实现原理

    一、分析自定义枚举类 普通的枚举类和抽象枚举类相似,故直接分析抽象枚举类。 1. 编写一个抽象枚举类 2. 编译 ...

  • 枚举_enum

    遍历 枚举类: 测试类 反射获取值 枚举类: 测试类:

  • Chapter 8 . 枚举

    阅读原文 Chapter 8 . 枚举 8.1 枚举类 主要内容: 如何自定义枚举类 如何使用enum定义枚举类 ...

网友评论

      本文标题:枚举帮助类EnumHelper--NetCore3/.Net5

      本文链接:https://www.haomeiwen.com/subject/yhpmnktx.html