2010-12-18 7 views
16

Quiero sincronizar una función utilizando un atributo. Me gustaría hacer algo como esto:C# Time a function using attribute

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

después de la ejecución de esta función, si el tiempo empleado por la función está por encima de un umbral, el atributo debe registrar la hora usando log4net.

Esto es similar a lo que hace MVC ActionFilterAttribute, excepto que no quiero usar MVC.

+2

PostSharp hace algo así como esto - desafortunadamente no es gratis: http://www.sharpcrafters.com/postsharp –

+0

¿Funcionaría Castle.DynamicProxy aquí? No enviar como respuesta porque esto realmente es una pregunta. – Amy

Respuesta

13

Los atributos son (con algunas excepciones muy pocas como [PrincipalPermission] que se detecta por el tiempo de ejecución en sí) metadatos solamente; también lo hace no causa código adicional para ser invocado mágicamente. La excepción a esto es a través de herramientas como PostSharp, que en el tiempo de compilación localiza dichos atributos y teje códigos adicionales.

En todos los demás casos, debería comprobar este atributo por reflexión y escribir código para invocar los métodos adicionales de los atributos. Esto es lo que ASP.NET MVC hace; identifica una familia esperada de atributos y llama a los métodos de la clase base para provocar el disparo de tus filtros.

Si está escribiendo un marco de plugins, esto podría tener sentido. Si se trata de una instrumentación de método ad-hoc, esto no funcionará sin que usted agregue el código adicional usted mismo.

Lo que podría ser más fácil es escribir un tipo IDisposable que escribe el tiempo transcurrido cuando se desecha; entonces se podría hacer:

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

Tal vez un ligero abuso de using pero debería funcionar.

+0

Buena explicación concisa. –