我定义了以下自定义属性:
[AttributeUsage(AttributeTargets.All)]
public class CustomAuthAttribute : AuthorizeAttribute
{
private MyPermissionLevels requestedAccessLevel;
public CustomAuthAttribute(object AccessLevel = null)
{
AccessLevel = AccessLevel ?? MyPermissionLevels.View;
if(AccessLevel.GetType() != typeof(MyPermissionLevels))
{
throw new ArgumentException("AccessLevel is invalid.");
}
this.requestedAccessLevel = (MyPermissionLevels)AccessLevel;
}
... // Other Auth Stuff
}
当我将此属性应用于控制器时,例如,[CustomAuthAttribute (AccessLevel = MyPermissionLevels.Modify)]
Intellisense抱怨:
找不到类型或名称空间名称“ AccessLevel”。(等等?)
Alt+ 揭示的潜在修复Enter包括:
将“ AccessLevel”更改为“ AccessLevel:”
添加此冒号(并暗示删除=
运算符,这不是建议的修复程序的自动组成部分)确实可以解决编译错误。
如果可以的话,我可以使用其他语法。但是,我想了解自己所做的事情,这些工作使我无法使用更常见的属性字段初始化语法,如对命名参数混淆的回答中所述,并且可以使用父类来完成:
[Authorize(Roles = "Modifiers")]
冒号是必需的,因为这是命名参数的语法。该字段不是公开的,您也不想分配给它。该字段的名称requestedAccessLevel
不是AccessLevel
。
父类具有一个公共属性Roles
,因此如下所示:
[Authorize(Roles = "Modifiers")]
Roles
不是命名构造函数参数,而是属性,因此不使用命名参数语法。实际上,该属性没有接受参数的构造函数。它仅具有公共的可分配属性。