Подтвердить что ты не робот

Передача пользовательского атрибута с переменным значением в качестве параметра

Я создал собственный класс атрибутов, который проверяет безопасность системы и выдает исключение проверки подлинности, если есть ошибка безопасности.

public class EntityChecker: System.Attribute
{
    public EntityChecker(int entityId)
    {
        // doing some logic to check if the entityId is allowed to be inserted
    }
}

Я хочу использовать этот пользовательский атрибут в качестве объявления функции добавления сущности, и я хочу передать переменную из этой функции в конструктор атрибутов. может ли это быть сделано?

[EntityChecker(entityId)]
public int AddNewEntity(entityId)
{
 // logic of entity addition
}
4b9b3361

Ответ 1

Можно ли сделать что-то подобное?!

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

Учитывая ваше описание, атрибут, вероятно, не подходит для этого. Так как вы хотите запустить дополнительный код, который происходит за звонок, вам понадобится другой метод. Например, вы можете передать делегат, то есть:

public int CheckedAddEntity(int entityId, Func<int, int> funcToAdd)
{
    // Perform your checking on entityId here
    return funcToAdd();
}

Это позволит вам позвонить через что-то вроде:

int result = CheckedAddEntity(entityId, AddNewEntity);

Ответ 2

В этом случае я рекомендую посмотреть аспектно-ориентированное программирование. Это другой способ сделать код, но тот, который позволяет вам повторно использовать логику шаблонов (например, проверку подлинности). Возможно, вам придется разработать свой атрибут немного по-другому, но вся логика может быть помещена в "аспект", который затем автоматически скомпилируется в код при создании проекта.

Я лично использую PostSharp, хотя знаю, что есть другие. У них есть бесплатная лицензия для разработки; до тех пор, пока вы не требуете расширенной функциональности, это очень экономично.

http://www.postsharp.net/blog/post/5-Ways-That-Postsharp-Can-SOLIDify-Your-Code-Authorization