根據枚舉的類型名稱獲取枚舉類型列表


前言

前端進行搜索或其他操作時需要獲取枚舉列表,每個枚舉寫一個接口比較繁瑣,所以這里根據枚舉類型名獲取列表

以下為代碼示例

代碼

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();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM