zoukankan      html  css  js  c++  java
  • 根据枚举的类型名称获取枚举类型列表

    前言

    前端进行搜索或其他操作时需要获取枚举列表,每个枚举写一个接口比较繁琐,所以这里根据枚举类型名获取列表

    以下为代码示例

    代码

    EnumDto.cs 返回的枚举信息类

    public class EnumDto
    {
        /// <summary>
        /// 枚举code
        /// </summary>
        public string Code { get; set; }
        
        /// <summary>
        /// 值
        /// </summary>
        public int Value { get; set; }
        
        /// <summary>
        /// 描述
        /// </summary>
        public string Description { get; set; }
    }
    

    EnumExpansion.cs 枚举拓展类

    using System.ComponentModel;
    using System.Reflection;
    
    namespace System
    {
        public static class EnumExpansion
        {
            /// <summary>
            /// 获取枚举项上的<see cref="DescriptionAttribute"/>特性的文字描述
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public static string ToDescription(this Enum enumValue)
            {
                string value = enumValue.ToString();
                FieldInfo field = enumValue.GetType().GetField(value);
                object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);    //获取描述属性
                if (objs.Length == 0)    //当描述属性没有时,直接返回名称
                    return value;
                DescriptionAttribute descriptionAttribute = (DescriptionAttribute)objs[0];
                return descriptionAttribute.Description;
            }
        }
    }
    

    EnumException.cs 枚举异常类

    public class EnumException:Exception
    {
        public EnumException()
        {
    
        }
        public EnumException(string message):base(message)
        {
    
        }
    }
    

    EnumHelper.cs 枚举帮助类

    /// <summary>
    /// 枚举帮助类
    /// </summary>
    public class EnumHelper
    {
    
        private static ConcurrentDictionary<string, Assembly> AssemblyList = new ConcurrentDictionary<string, Assembly>();
    
        /// <summary>
        /// 根据枚举代码获取枚举列表
        /// </summary>
        /// <param name="assembly">程序集名称集合</param>
        /// <param name="namespaces">命名空间名称集合</param>
        /// <param name="code">枚举名称</param>
        /// <returns></returns>
        public static List<EnumDto> GetEnumListByCode(IEnumerable<string> assemblys,IEnumerable<string> namespaces,string EnumCode)
        {
            assemblys = assemblys.Distinct();
            namespaces = namespaces.Distinct();
            var Inexistentassembly = assemblys.Except(AssemblyList?.Select(o=>o.Key));
            foreach (var assembly in Inexistentassembly)
                AssemblyList.TryAdd(assembly, System.Reflection.Assembly.Load(assembly));
            List<Type> enumlist = new List<Type>();
            List<string> enumNamespanList = new List<string>();
            foreach (var enumNamespace in namespaces)
            {
                foreach (var assembly in AssemblyList)
                {
                    var enumInfo = assembly.Value.CreateInstance($"{enumNamespace}.{EnumCode}", false);
                    if (enumInfo != null)
                    {
                        enumNamespanList.Add(enumNamespace);
                        enumlist.Add(enumInfo.GetType());
                    }
                }
            }
            if (enumlist.Count == 0) return default;
            if (enumlist.Count > 1)
                throw new EnumException($"枚举【{EnumCode}】存在多个,请检查命名空间【{string.Join(',', enumNamespanList)}】");
            var enums = Enum.GetValues(enumlist.FirstOrDefault());
            List<EnumDto> enumDic = new List<EnumDto>(); 
            foreach (Enum item in enums)
            {
                enumDic.Add(new EnumDto() { Code = item.ToString(), Value = Convert.ToInt32(item), Description = item.ToDescription() });
            }
            return enumDic;
        }
    }
    

    如果多个程序集 和 多个命名空间出现一样的枚举类型将会抛出异常

    使用

    运行当前方法的程序集需要引用使用到的程序集

    例如当前使用到的程序集名称为EnumList

    当前使到的命名空间为EnumList.Enums

    当前需要获取的枚举类型为UserType

    static void Main(string[] args)
    {
    
        var enumName = "UserType";
        var dic = EnumHelper.GetEnumListByCode(new[] { "EnumList" },new[] { "EnumList.Enums" }, enumName);
        foreach (var item in dic)
        {
            Console.WriteLine($"code:{item.Code},value:{item.Value},描述:{item.Description}");
        }
        Console.ReadKey();
    }
    
  • 相关阅读:
    [GXYCTF2019]BabyUpload
    [GYCTF2020]Blacklist
    [极客大挑战 2019]HardSQL
    PHP实现MVC框架路由功能模式
    色环电阻的阻值识别
    python的内存回收机制
    配置Openfiler做ISCS实验
    windows server 2008r2 在vmware里自动关机
    VMware Workstation网络修改vlan id值
    linux的服务自动启动的配置
  • 原文地址:https://www.cnblogs.com/qs315/p/13597045.html
Copyright © 2011-2022 走看看