public class CustomLogger : DispatchProxy where T : class
{
    private readonly ILogger _logger;
    private T target;
    protected override object Invoke
    (MethodInfo targetMethod, object() args)
    {
       throw new NotImplementedException();
    }
    public static T Create(T target)
    {
       throw new NotImplementedException();
    }
}

A classe CustomLogger mostrada no código anterior usa Serilog para registrar dados neste exemplo. O trecho de código a seguir mostra como você pode atualizar o método Invoke que criamos na classe MyClassDispatchProxy anteriormente para incorporar recursos de log.


protected override object Invoke
    (MethodInfo targetMethod, object() args)
    {
        if(targetMethod == null)
            throw new ArgumentNullException(nameof(targetMethod));
        _logger.Information($"Entering method: {targetMethod.Name}...");
         var result = targetMethod.Invoke(target, args);
        _logger.Information($"Exiting method: {targetMethod.Name}...");
        return result;
    }

Observe como as chamadas de método são registradas antes e depois da invocação no método Invoke. Se a instância targetMethod for nula, o método Invoke lançará uma exceção. No método Create, criamos uma nova instância do CustomLogger classe e, em seguida, defina o objeto de destino com base no qual o objeto proxy interceptará chamadas de método.