如何解决如何从属性获取构造函数命名参数
我和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 { /// }
这是我获取控制器属性的方式:
var attributeData = controllerInfo
.CustomAttributes
.FirstOrDefault(attrs => attrs.AttributeType == typeof(MenuItemAttribute))
.NamedArguments;
如果使用ConstructorArguments
而不是NamedArguments
,就可以看到参数。
我想念什么?
解决方法
当前,您所有的参数都是位置参数,因此它们将在ConstructorArguments
中返回。
如docs中所述:
属性类的每个非静态公共读写字段和属性都为该属性类定义了一个命名参数。
将您的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个元素。
语法:
[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
调用IsDefaultRoute
属性的属性设置者,其值为{ {1}})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。