Tiempo de ejecución de métodos de rastreo

Estoy tratando de "inyectar" métodos de rastreo personalizados en mi aplicación.

Quiero hacerlo lo más elegante posible, sin modificar gran parte del código existente, y tengo la posibilidad de habilitarlo / deshabilitarlo fácilmente.

Una solución que podría pensar sería crear una costumbreAttribute que lo adjuntaré a los métodos que quiero rastrear.

Idea básica:

public class MethodSnifferAttribute : Attribute
{
    private Stopwatch sw = null;

    public void BeforeExecution()
    {
        sw = new Stopwatch();
        sw.Start();
    }
    public void ExecutionEnd()
    {
        sw.Stop();
        LoggerManager.Logger.Log("Execution time: " + sw.ElapsedMilliseconds);
    }
}

public class MyClass
{
    [MethodSniffer]
    public void Function()
    {
        // do a long task
    }
}

¿Hay alguna existente.NET atributos que proporcionan devoluciones de llamada para cuando se llama / finaliza un método?

Respuestas a la pregunta(2)

Su respuesta a la pregunta