Как создать пользовательский атрибут, на который влияют переменные времени выполнения? (например, PrincipalPermissionAttribute) - PullRequest
0 голосов
/ 17 ноября 2010

Как создать атрибут, который проверяет переменную каждый раз, когда метод вызывается?

Когда PrincipalPermissionAttribute присоединен к методу (показано ниже).Если правила, указанные в параметрах, не выполнены, генерируется исключение.

[PrincipalPermission(SecurityAction.Demand, Role = "Admin"]
public void MyMethod()
{
    //Do something if you are an "Admin"
}

В основном (в этом примере), всякий раз, когда MyMethod() вызывается , значение Thread.CurrentPrincipal равнопроверено и если это не Роль "Admin", SecurityException выбрасывается.

Итак ... как мне подражать этому поведению?Я хотел бы атрибут метода, который «реагирует» на переменную времени выполнения.Большинство примеров атрибутов, которые я нашел в Интернете, связаны с добавлением отображаемого имени к свойству или чему-то подобному.

Ответы [ 3 ]

2 голосов
/ 17 ноября 2010

Используйте для этого AOP framework , чтобы внедрить код при нажатии определенного метода.Вы также можете сделать это нативно через .NET Framework с ContextBoundObject ;Вероятно, это то, что они использовали в рамках.

1 голос
/ 17 ноября 2010

Ваше понимание атрибутов .NET кажется немного мутным.

Атрибуты - это способ прикрепления метаинформации к классам и сборкам в целях отражения.

Атрибуты обычно не содержат поведения.Это просто данные.

То, что вы видите с PrincipalPermissionAttribute, - это активированная система безопасности .NET Runtime.Процесс безопасности проверяет атрибуты, связанные с безопасностью, в методе при его вызове.Наличие атрибутов определяет поведение процесса безопасности.

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

0 голосов
/ 17 ноября 2010

Вы думаете об этом неправильно. Дело не в том, что атрибут имеет изменяющееся значение, а в том, что его интерпретация кодом, использующим атрибут, основана на состоянии времени выполнения. В приведенном вами примере, вероятно, код, проверяющий этот атрибут, также выполняет проверку Thread.CurrentPrinciple и предпринимает действия на основе этого. Атрибут ничего не делает, кроме как хранит несколько постоянных полей. Лучше, если вы сделаете то же самое. Помните также, что наложение атрибута на метод (или что-либо еще) волшебным образом ничего не делает. Вы должны иметь код, который с помощью отражения захватывает эти атрибуты и интерпретирует данные в них некоторым полезным и актуальным способом. Так что это зависит от вашего кода интерпретатора, а не от атрибута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...