1、获取枚举集合(根据枚举类名通过反射实现)

    ///

    /// 枚举下拉列表接口
    ///

    ///
    [HttpGet(“enumerations/{enumCode}”)]
    [AllowAnonymous]
    public IEnumerable GetProjectTypes(string enumCode)
    {
        var generalInfoAppService = LazyServiceProvider.LazyGetRequiredService();
        return generalInfoAppService.GetSelectListForEnumeration(enumCode, typeof(SupplyStatus).Assembly.FullName);
    }

2、接口定义

using System.Reflection;
using Tzkj.Application.Contracts.Dtos;
using Tzkj.Core.DomainObjects;
using Volo.Abp.Application.Services;

namespace Tzkj.Application.Contracts;

public interface IGeneralInfoAppService : IApplicationService
{
    IEnumerable GetSelectListForEnumeration(string enumCode, string domainSharedAssemblyFullName);
    string GetStorageFullUrl(string storageName);
}

3、接口实现方法

using Microsoft.Extensions.Options;
using System;
using System.Reflection;
using System.Security.AccessControl;
using System.Text.RegularExpressions;
using Tzkj.Application.Contracts;
using Tzkj.Application.Contracts.Dtos;
using Tzkj.BlobStorings.Abstractions;
using Tzkj.Core.DomainObjects;
using Tzkj.Core.Enums;
using Tzkj.Core.Enums.Approvals;
using Volo.Abp;

namespace Tzkj.Application;

public class GeneralInfoAppService : AppServiceBase, IGeneralInfoAppService
{
    private readonly MinioOptions _minioOptions;
    public GeneralInfoAppService(IOptions options)
    {
        _minioOptions=options.Value;
    }
    public IEnumerable GetSelectListForEnumeration(string enumCode, string domainSharedAssemblyFullName)
    {
        var coreAssembly = typeof(ApproveTrigger).Assembly;
        var domainSharedAssembly = Assembly.Load(domainSharedAssemblyFullName);
        var allAssemblies = new List { domainSharedAssembly, coreAssembly };
        var baseType = typeof(Enumeration);
        var derivedTypes = allAssemblies
        .SelectMany(a => a.GetTypes())
        .Where(t => t.BaseType != null&& t.BaseType.Name == typeof(Enumeration).Name);

        var curEnumType = derivedTypes.FirstOrDefault(derivedType => enumCode == derivedType.Name);
        if (curEnumType is null)
            throw new UserFriendlyException($"参数{nameof(enumCode)}值{enumCode}不是有效的枚举名称");
        var method = curEnumType!.BaseType!.BaseType!.GetMethod("GetSelectItems", BindingFlags.Public | BindingFlags.Static);
        var retObject = method!.Invoke(null, null);
        return ((retObject as List)!).Select(i=>new SelectListItemDto(i.Value,i.Text));
    }

    public string GetStorageFullUrl(string storageName)
    {
        if (storageName.IsNullOrWhiteSpace())
            return storageName;
        var endpoint = _minioOptions.OutSideEndpoint.Split(':');
        var host = endpoint[0];
        var port = (endpoint.Length > 1 ? endpoint[1] : "80").To();
        if (storageName.StartsWith("http://") || storageName.StartsWith("http://"))
        {
            var uriBuilder = new UriBuilder(storageName);
            var pattern = @"\b(?:\d{1,3}\.){3}\d{1,3}(?::\d{1,5})?\b";
            if (!Regex.IsMatch(uriBuilder.Host, pattern))
                return storageName;
            if (uriBuilder.Host == host && uriBuilder.Port == port) 
                return storageName;
            uriBuilder.Host=host;
            uriBuilder.Port = port;
            return uriBuilder.ToString();
        }
        storageName = storageName.TrimStart('/');
        
        var builder = new UriBuilder("http", host, port);
        var paths = new List { _minioOptions.BucketName, "host", storageName };
        builder.Path = Path.Combine(paths.ToArray());
        return builder.ToString();
    }
}
    public IEnumerable GetSelectListForEnumeration(string enumCode, string domainSharedAssemblyFullName)
    {
        var coreAssembly = typeof(ApproveTrigger).Assembly;
        var domainSharedAssembly = Assembly.Load(domainSharedAssemblyFullName);
        var allAssemblies = new List { domainSharedAssembly, coreAssembly };
        var baseType = typeof(Enumeration);
        var derivedTypes = allAssemblies
        .SelectMany(a => a.GetTypes())
        .Where(t => t.BaseType != null&& t.BaseType.Name == typeof(Enumeration).Name);

        var curEnumType = derivedTypes.FirstOrDefault(derivedType => enumCode == derivedType.Name);
        if (curEnumType is null)
            throw new UserFriendlyException($"参数{nameof(enumCode)}值{enumCode}不是有效的枚举名称");
        var method = curEnumType!.BaseType!.BaseType!.GetMethod("GetSelectItems", BindingFlags.Public | BindingFlags.Static);
        var retObject = method!.Invoke(null, null);
        return ((retObject as List)!).Select(i=>new SelectListItemDto(i.Value,i.Text));
    }

注意:

以上根据枚举类名通过反射实现,且使用懒加载,注入的IGeneralInfoAppService服务,且传递的枚举类必须在项目下,在该解决方案不同的项目下是查询不出来的

本站无任何商业行为
个人在线分享 » 根据反射获取枚举值集合
E-->