【问题标题】:How to get displayname attribute value from controller?如何从控制器获取 displayname 属性值?
【发布时间】: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&lt;ControllerActionDescriptor&gt;().ControllerTypeInfo.Attributes 或类似的操作。
  • @DavidG :实施动态策略
  • @DavidG : 请解释一下
  • RolesController 继承了ControllerBase 不是 RouteEndpoint,因此带有.OfType&lt;RouteEndpoint&gt;() 的父查询将不包含RolesController 类。

标签: c# asp.net asp.net-core asp.net-core-webapi


【解决方案1】:

不确定您的 endpointSources 是什么,但这里有一个工作演示,用于获取控制器名称和显示名称:

Assembly asm = Assembly.GetExecutingAssembly();
var controllerlist = asm.GetTypes()
        .Where(type => typeof(ControllerBase).IsAssignableFrom(type))
        .Select(type => type.GetTypeInfo())
        .Select(x => new
        {
            Controller = x.Name,
            ControllerDisplayName = x.GetCustomAttribute<DisplayNameAttribute>()?.DisplayName

        }).ToList();

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2018-12-05
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多