我和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 值为 true
的 IsDefaultRoute
属性)
关于c# - 如何从属性获取构造函数命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64696816/