2010-12-18 11 views
16

Chcę czas funkcji za pomocą atrybutu. Chciałbym zrobić coś takiego:C# Czas funkcji za pomocą atrybutu

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

po wykonaniu tej funkcji, jeśli czas wzięty przez funkcję jest powyżej progu, atrybut powinien zalogować czas używając log4net.

To jest podobne do działania ActionVectorMVC, ale nie chcę używać MVC.

+2

PostSharp robi coś dokładnie takiego - niestety nie jest za darmo: http://www.sharpcrafters.com/postsharp –

+0

Czy Castle.DynamicProxy będzie tutaj działać? Nie przesyłając odpowiedzi, bo to naprawdę pytanie. – Amy

Odpowiedz

13

atrybuty są (z bardzo nielicznymi wyjątkami jak [PrincipalPermission] które nanosi się przez samą wykonania) metadanych tylko; tak więc nie powoduje dodatkowy magiczny sposób wywoływania. Wyjątkiem są narzędzia takie jak PostSharp, które w czasie kompilacji lokalizuje takie atrybuty i splata w dodatkowy kod.

We wszystkich innych przypadkach konieczne jest sprawdzenie tego atrybutu samodzielnie poprzez odbicie i napisanie kodu, aby wywołać dodatkowe metody z atrybutów. To właśnie robi ASP.NET MVC; identyfikuje oczekiwaną rodzinę atrybutów i wywołuje metody klasy bazowej, aby spowodować uruchomienie filtrów.

Jeśli piszesz framework wtyczki, może to mieć sens. Jeśli jest to instrumentacja oparta na ad-hoc - to nie zadziała, jeśli sam nie dodasz dodatkowego kodu.

Co jest łatwiejsze w zapisywaniu , pisze IDisposable, który zapisuje upływ czasu, w którym został usunięty; to można zrobić:

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

Może lekkie nadużycie using ale powinno działać.

+0

Ładne, zwięzłe wyjaśnienie. –

Powiązane problemy