2011-02-01 9 views

Respuesta

4

Creo que estás en busca de lo que se denomina programación orientada a aspectos. Hay muchas bibliotecas C# para ayudar con esto. Uno se llama PostSharp (la versión gratuita de PostSharp admite esta funcionalidad). Aquí hay un ejemplo similar al ejemplo de alces. Esto crea un atributo de seguimiento que se puede utilizar en otros métodos para añadir esta funcionalidad extra:

[Serializable] 
public class TraceAttribute : OnMethodBoundaryAspect 
{ 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     Trace.WriteLine("about to call method"); 
    } 

    public override void OnExit(MethodExecutionArgs args) 
    { 
     Trace.WriteLine("just finished calling method"); 
    } 
} 

deberá añadir al método de "Foo" mediante la colocación de la traza atribuir justo antes de que:

[Trace] 
public void Foo() { /* ... */ } 

Ahora cuando Foo se ejecuta, el método OnEntry anterior se ejecutará antes que él, y OnExit se ejecutará inmediatamente después.

+0

¿Puedo modificar los argumentos a medida que se pasan a la función? Veo que los recibo, pero no puedo decir a partir de la documentación si puedo modificarlos. – rpkelly

+0

@rpkelly - ¿Qué esperas específicamente con los argumentos? –

+0

Bueno, necesito registrar las llamadas a la función y sus valores devueltos, así como manejar la generación automática de una "identificación de transacción" que se pasa a la función (que actualmente se genera en otro lugar). – rpkelly

0

No, no es la manera en que se hace en Moose. Es posible que desee buscar en alguna biblioteca de AOP.

2

Puede lograr el mismo efecto utilizando un proxy dinámico. Un ejemplo es el Castle Dynamic Proxy.

Tales frameworks aprovechan las instalaciones de reflexión C# para construir clases 'proxy' o 'wrapper'. Así que tenlo en mente. Hay una cierta cantidad de sobrecarga debido a esto. Alternativamente, puede utilizar marcos que pueden create classes statically via code generation.