Можно создать атрибут, который будет оцениваться после, а не раньше? - PullRequest
0 голосов
/ 01 октября 2009

Мне известно о написании пользовательских атрибутов, которые украшают метод и оцениваются до его выполнения, но есть ли способ изменить его, чтобы атрибут оценивался после , когда метод выполняется?

Теоретически (в псевдокоде):

public void MyMethod()
{
     Console.WriteLine("Hello World");
}
[AttributeToExecuteAfter]

Я неправильно использую понятие атрибута? Если по техническим причинам это невозможно, то что это?

Ответы [ 4 ]

2 голосов
/ 01 октября 2009

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

Вот лучший пример, который я могу придумать:

Платформа бизнес-объектов, которую я использую, имеет концепцию DataPortal. В многоуровневой среде DataPortal сидит на сервере и выполняет методы CRUD моих бизнес-объектов. DataPortal был написан таким образом, что перед вызовом любого из моих методов CRUD сначала проверяется, имеет ли метод атрибут RunMeInATransaction. Если это так, он создает транзакцию, запускает метод и затем фиксирует транзакцию. Концептуально это очень похоже на методы, имеющие свойства; мои методы могут иметь свойство RunMeInATransaction.

1 голос
/ 01 октября 2009

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

1 голос
/ 01 октября 2009

Вы имеете в виду ActionFilters в .net MVC?

Если да, вы можете переопределить метод OnActionExecuted, расширив абстрактный класс ActionFilterAttribute. Это относится только к методам действия mvc.

0 голосов
/ 01 октября 2009

Как сказал Кен, атрибут - это просто метаданные, прикрепленные к методу / свойству / полю / классу, которые полезны для "тегирования" элементов, а затем могут распознавать его с помощью кода с помощью отражения.

Т.е. атрибуты используются в Linq2Sql как способ отображения классов с таблицами базы данных.

Возможно, ваше недоразумение связано с тем, что компилятор C # фактически использует некоторые специальные атрибуты для выполнения конкретных операций. Но такая функциональность недоступна для нас, разработчиков-людей:)

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