在ASPNETCORE中获得所有Action

在ASPNETCORE中获得所有Action

本文旨在记录自己在aspnetcore工作中需要获取所有Action,在查询了资料后进行了几种方法的记录。后期有发现其它方式再进行追加。

一、通过 反射 查看

(该方法过于常见,此处略)

二、通过 ApplicationPartManager 查看

  1. 通过构造函数注入ApplicationPartManager
  2. 通过 PopulateFeature() 方法将数据设置到ControllerFeature实例中;

public class ListController : Controller
{
    public ListController(ApplicationPartManager applicationPartManager)
    {
        _applicationPartManager = applicationPartManager;
    }
    private ApplicationPartManager _applicationPartManager;

    public IEnumerable<dynamic> List()
    {
        var controllerFeature = new ControllerFeature();
        _applicationPartManager.PopulateFeature(controllerFeature);
        var data = controllerFeature.Controllers.Select(x => new
            {
                Namespace = x.Namespace,
                Controller = x.FullName,
                ModuleName = x.Module.Name,
                Actions = x.DeclaredMethods.Where(m=>m.IsPublic && !m.IsDefined(typeof(NonActionAttribute))).Select(y => new
                {
                    Name = y.Name,
                    ParameterCount = y.GetParameters().Length,
                    Parameters = y.GetParameters()
                    .Select(z => new
                    {
                        z.Name,
                        z.ParameterType.FullName,
                        z.Position,
                        Attrs = z.CustomAttributes.Select(m => new
                        {
                            FullName = m.AttributeType.FullName,
                        })
                    })
                }),
            });
        return data;
    }
}

方法优缺点:

  • 优点:

使用方便;
能直接获取所有注册的Controller;

  • 缺点:

不能获取action信息;
不能方便的获取路由信息;

三、通过 IActionDescriptorCollectionProvider 查看

  1. 通过构造函数注入IActionDescriptorCollectionProvider 实例;

private IActionDescriptorCollectionProvider _actionProvider;

public IEnumerable<dynamic> List()
{
    var actionDescs = _actionProvider.ActionDescriptors.Items.Cast<ControllerActionDescriptor>().Select(x => new 
    {
        ControllerName = x.ControllerName,
        ActionName = x.ActionName,
        DisplayName = x.DisplayName,
        RouteTemplate = x.AttributeRouteInfo.Template,
        Attributes = x.MethodInfo.CustomAttributes.Select(z=>new {
            TypeName = z.AttributeType.FullName,
            ConstructorArgs = z.ConstructorArguments.Select(v => new {
                ArgumentValue = v.Value
            }),
            NamedArguments = z.NamedArguments.Select(v => new {
                v.MemberName,
                TypedValue = v.TypedValue.Value,
            }),
        }),
        ActionId = x.Id,
        x.RouteValues,
        Parameters = x.Parameters.Select(z => new {
            z.Name,
            TypeName = z.ParameterType.Name,
        })
    });

    return actionDescs;
}

方法优缺点

  • 优点:

能快速查看所有的acton详细信息及其路由信息,包括参数信息,特性等等;

  • 缺点:

不能方便得查看Controller的信息;

转载于:https://www.cnblogs.com/m-meng/p/10716451.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值