温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c# - Why Does Named Parameter For A Custom Attribute Require `:` Syntax?
asp.net asp.net-mvc c# intellisense

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

发布于 2020-03-27 11:43:29

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

[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")]

查看更多

查看更多

提问者
Trevor Reid
被浏览
113
Amy 2019-07-03 23:11

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

父类具有一个公共属性Roles,因此如下所示:

[Authorize(Roles = "Modifiers")]

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