为什么自定义属性的命名参数需要 `:` 语法?
Why Does Named Parameter For A Custom Attribute Require `:` Syntax?
我定义了以下自定义属性:
[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 抱怨:
The type or namespace name 'AccessLevel' could not be found. (etc?)
Alt + Enter 显示的潜在修复包括:
Change 'AccessLevel' to 'AccessLevel:'
添加此冒号(并暗示删除 =
运算符,这不是建议修复的自动部分)确实解决了编译错误。
如果仅此而已,我可以使用不同的语法。但是,我想了解我做了什么阻止我使用更常见的属性 field-initialization 语法 ,如 Named parameters confusion 的答案中所述,并且可以完成 parent class:
[Authorize(Roles = "Modifiers")]
冒号是必需的,因为这是命名参数的语法。该字段不是 public,您也没有尝试分配给它。该字段的名称是 requestedAccessLevel
,而不是 AccessLevel
。
父class有一个public属性Roles
,所以在行中:
[Authorize(Roles = "Modifiers")]
Roles
不是命名构造函数参数,它是 属性,因此不使用命名参数语法。实际上,该属性没有接受参数的构造函数。它只有 public 个可分配的属性。
[CustomAuthAttribute (MyPermissionLevels.Modify)]
应该没问题。
形式 [CustomAuthAttribute (AccessLevel = MyPermissionLevels.Modify)]
意味着您使用无参数构造函数并并行地为名为 AccessLevel
.
的 属性 赋值
相反,您应该为参数提供一个值。
您可以通过简单地提供值或使用命名参数形式 (parameter_name + ':')
.
来完成此操作
我定义了以下自定义属性:
[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 抱怨:
The type or namespace name 'AccessLevel' could not be found. (etc?)
Alt + Enter 显示的潜在修复包括:
Change 'AccessLevel' to 'AccessLevel:'
添加此冒号(并暗示删除 =
运算符,这不是建议修复的自动部分)确实解决了编译错误。
如果仅此而已,我可以使用不同的语法。但是,我想了解我做了什么阻止我使用更常见的属性 field-initialization 语法 ,如 Named parameters confusion 的答案中所述,并且可以完成 parent class:
[Authorize(Roles = "Modifiers")]
冒号是必需的,因为这是命名参数的语法。该字段不是 public,您也没有尝试分配给它。该字段的名称是 requestedAccessLevel
,而不是 AccessLevel
。
父class有一个public属性Roles
,所以在行中:
[Authorize(Roles = "Modifiers")]
Roles
不是命名构造函数参数,它是 属性,因此不使用命名参数语法。实际上,该属性没有接受参数的构造函数。它只有 public 个可分配的属性。
[CustomAuthAttribute (MyPermissionLevels.Modify)]
应该没问题。
形式 [CustomAuthAttribute (AccessLevel = MyPermissionLevels.Modify)]
意味着您使用无参数构造函数并并行地为名为 AccessLevel
.
相反,您应该为参数提供一个值。
您可以通过简单地提供值或使用命名参数形式 (parameter_name + ':')
.