c# - 如何从属性获取构造函数命名参数

标签 c# reflection arguments

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

这是我的属性定义:

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 { /// }

这就是我获取 Controller 属性的方法:

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

如果我使用 ConstructorArguments 而不是 NamedArguments,我就可以看到参数。

我错过了什么?

最佳答案

语法:

[MenuItem(
    applicationCategory: ApplicationCategoryEnum.CONTROLPANEL,
    controllerDisplayName: "Account Management",
    isDefaultRoute: false)]

代表构造函数参数;您想要的数据位于 ConstructorArguments 成员中:

var attrib = typeof(AccountController)
    .CustomAttributes
    .FirstOrDefault(attrs => attrs.AttributeType == typeof(MenuItemAttribute));
if (attrib is object)
{
    var declared = attrib.Constructor.GetParameters();
    var values = attrib.ConstructorArguments;
    for (int i = 0; i < values.Count; i++)
    {
        Console.WriteLine($"{declared[i].Name}={values[i].Value}");
    }
}

(NamedArguments 用于涉及 = 的极其细微的不同用法,即 IsDefaultRoute = true 调用属性 setter 值为 trueIsDefaultRoute 属性)

关于c# - 如何从属性获取构造函数命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64696816/

相关文章:

c - 宏中的可变参数

c# - Web 浏览器控件无法正确显示 html 文件

c# - 并发访问捕获的局部变量

java - 反射类型检查?

actionscript-3 - flash.utils.getDefinitionByName 与 ApplicationDomain 的类定义方法

c# - 反射(reflect)一个列表<T>

c# - Xamarin Forms 在绑定(bind)到条目的文本属性时卡住

c# - 如何在 LINQ to XML 语句中返回同级 XElements?

batch-file - SHIFT 不影响 %*

ruby - 使用参数与 ruby​​ require