首页 > 解决方案 > 如何从属性中获取构造函数命名参数

问题描述

我和这个问题有同样的问题。问题是,即使在属性的构造函数中使用命名参数,我仍然得到一个空集合。

这是我的属性定义:

public class MenuItemAttribute : Attribute
{
    ApplicationCategoryEnum ApplicationCategory { get; }
    string ControllerDisplayName { get; }
    bool IsDefaultRoute { get; }

    public MenuItemAttribute(ApplicationCategoryEnum applicationCategory, string controllerDisplayName, bool isDefaultRoute)
    {
        ControllerDisplayName = controllerDisplayName;
        ApplicationCategory = applicationCategory;
        IsDefaultRoute = isDefaultRoute;
    }
}

这就是我使用它的方式:

[MenuItem(
    applicationCategory: ApplicationCategoryEnum.CONTROLPANEL,
    controllerDisplayName: "Account Management",
    isDefaultRoute: false)]
public class AccountController : Controller { /// }

这就是我如何通过控制器的属性:

var attributeData = controllerInfo
    .CustomAttributes
    .FirstOrDefault(attrs => attrs.AttributeType == typeof(MenuItemAttribute))
    .NamedArguments;

如果我使用ConstructorArguments而不是NamedArguments.

我错过了什么?

标签: c#reflectionarguments

解决方案


目前,您的所有参数都是位置参数,因此它们以ConstructorArguments.

正如文档中所写:

属性类的每个非静态公共读写字段和属性都为属性类定义了一个命名参数。

将您更改MenuItemAttribute为例如:

    public class MenuItemAttribute : Attribute
    {
        ApplicationCategoryEnum ApplicationCategory { get; }
        public string ControllerDisplayName { get; set; }
        public bool IsDefaultRoute { get; set; }

        public MenuItemAttribute(ApplicationCategoryEnum applicationCategory)
        {
            ApplicationCategory = applicationCategory;
        }
    }

和用法

[MenuItem(ApplicationCategoryEnum.CONTROLPANEL, ControllerDisplayName = "asdsa", IsDefaultRoute = true)]

将为您提供 2 个集合中的元素NamedArguments


推荐阅读