如何从属性中获取构造函数命名参数



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

这是我的属性定义:

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,我可以看到参数。

我错过了什么?

语法:

[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调用值为trueIsDefaultRoute属性的属性设置器(

当前所有参数都是位置参数,因此它们在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)]

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

相关内容

最新更新