Почему именованный параметр для пользовательского атрибута требует `:` Синтаксис? - PullRequest
0 голосов
/ 03 июля 2019

Я определил следующий пользовательский атрибут:

[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 + Ввод , включают:

Измените AccessLevel на AccessLevel:

Добавление этого двоеточия (и подразумеваемое удаление оператора =, который не является автоматическим элементом предлагаемого исправления) устраняет ошибку компиляции.

Я в порядке, используя другой синтаксис, если это все, что нужно.Однако, Я хотел бы понять, что я сделал, что мешает мне использовать более общий синтаксис инициализации поля атрибута , как описано в ответах на Путаница именованных параметров , и как это можно сделатьс родительским классом:

[Authorize(Roles = "Modifiers")]

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

Двоеточие необходимо, потому что это синтаксис для именованных параметров. Поле не является общедоступным, и вы не пытаетесь его назначить. Имя поля requestedAccessLevel, а не AccessLevel.

У родительского класса есть открытое свойство Roles, поэтому в строке:

[Authorize(Roles = "Modifiers")]

Roles не является параметром именованного конструктора, это свойство, поэтому синтаксис именованного параметра не используется. Действительно, этот атрибут не имеет конструктора, который принимает параметры. Он имеет только общедоступные присваиваемые свойства.

1 голос
/ 04 июля 2019

[CustomAuthAttribute (MyPermissionLevels.Modify)] должно быть в порядке.

Форма [CustomAuthAttribute (AccessLevel = MyPermissionLevels.Modify)] означает, что вы используете конструктор без параметров и параллельно присваиваете значение свойству с именем AccessLevel.

Вместо этогоВы должны предоставить значение для параметра.Вы делаете это либо просто предоставляя значение, либо используя форму именованного параметра (parameter_name + ':').

...