【发布时间】:2021-12-28 15:00:06
【问题描述】:
我在控制器顶部有一个 DisplayName 属性。我的主要需求是给控制器设置一个昵称,当我拿到所有控制器后,除了原来的名字外,我还可以访问昵称。
几个控制器之一:
[Route("api/[controller]")]
[ApiController]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[DisplayName("Test Name")]
public class RolesController : ControllerBase
{
...
}
我的方法:
public IList<ActionAndControllerName> AreaAndActionAndControllerNamesList()
{
var endpoints = endpointSources
.SelectMany(es => es.Endpoints)
.OfType<RouteEndpoint>();
var output = endpoints.Select(
e =>
{
var controller = e.Metadata
.OfType<ControllerActionDescriptor>()
.FirstOrDefault();
return new
{
Controller = controller.ControllerName,
ControllerDisplayName = controller.MethodInfo.GetCustomAttribute<DisplayNameAttribute>()?.DisplayName,
};
}
但返回 null(ControllerDisplayName )。需要改变什么?
【问题讨论】:
-
您使用反射来获取属性,但我不知道您为什么要为控制器执行此操作,这完全没有意义!
-
但是,我认为您需要做
e.MetaData.OfType<ControllerActionDescriptor>().ControllerTypeInfo.Attributes或类似的操作。 -
@DavidG :实施动态策略
-
@DavidG : 请解释一下
-
RolesController继承了ControllerBase不是RouteEndpoint,因此带有.OfType<RouteEndpoint>()的父查询将不包含RolesController类。
标签: c# asp.net asp.net-core asp.net-core-webapi