C # Time функция с использованием атрибута - PullRequest
19 голосов
/ 18 декабря 2010

Я хочу определить время функции, используя атрибут.Я хотел бы сделать что-то вроде этого:

[TimeIt]
public MyFunc()
{
//do something
...
return;
}

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

Это похоже на то, что делает MVC ActionFilterAttribute, за исключением того, что я не хочу использовать MVC.

1 Ответ

13 голосов
/ 18 декабря 2010

Атрибуты являются (с некоторыми очень немногими исключениями, такими как [PrincipalPermission], который определяется самой средой выполнения) метаданными только ; поэтому не вызывает дополнительный магический вызов кода. Исключением из этого являются такие инструменты, как PostSharp, который во время сборки находит такие атрибуты и вплетает в дополнительный код.

Во всех других случаях вам придется самостоятельно проверять этот атрибут с помощью отражения и писать код для вызова дополнительных методов из атрибутов. Это то, что делает ASP.NET MVC; он определяет ожидаемое семейство атрибутов и вызывает методы базового класса, чтобы вызвать срабатывание фильтров.

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

То, что может быть проще, - это написать тип IDisposable, который записывает прошедшее время, когда он удаляется; тогда вы могли бы сделать:

using(new MyTimer("My label")) {
    //... Your method
}

Возможно, небольшое злоупотребление using, но это должно сработать.

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