为什么自定义属性的命名参数需要`:`语法?

时间:2019-07-03 15:05:50

标签: c# asp.net asp.net-mvc intellisense

我定义了以下自定义属性:

[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:”

添加此冒号(并暗示删除=运算符,这不是建议的修复程序的自动组成部分)确实可以解决编译错误。

如果可以的话,我可以使用其他语法。但是,我想了解我所做的使我无法使用更常见的属性字段初始化语法的操作,如Named parameters confusion的答案中所述,并且可以与父级一起使用课:

[Authorize(Roles = "Modifiers")]

2 个答案:

答案 0 :(得分:3)

冒号是必需的,因为这是命名参数的语法。该字段不是公开的,您也不想分配给它。该字段的名称为requestedAccessLevel,而不是AccessLevel

父类具有公共属性Roles,因此在该行中:

[Authorize(Roles = "Modifiers")]

Roles不是命名构造函数参数,它是一个属性,因此不使用命名参数语法。实际上,该属性没有接受参数的构造函数。它仅具有公共的可分配属性。

答案 1 :(得分:1)

[CustomAuthAttribute (MyPermissionLevels.Modify)]应该没问题。

[CustomAuthAttribute (AccessLevel = MyPermissionLevels.Modify)]形式表示您使用无参数构造函数,并并行将值分配给名为AccessLevel的属性。

您应该为参数提供一个值。 您可以通过简单地提供值或使用命名参数形式(parameter_name + ':')来完成此操作。