protected override object Invoke(MethodInfo targetMethod, object[] args) { var className = _decorated.GetType().FullName; var methodName = targetMethod.Name; var returnType = targetMethod.ReturnType; try { _logger.Log(_logEntryBuilder.BuildInvocationLogEntry(className, methodName, args)); var result = targetMethod.Invoke(_decorated, args); _logger.Log(_logEntryBuilder.BuildLeavingLogEntry(className, methodName, args, returnType, result)); return(result); } catch (Exception ex) when(ex is TargetInvocationException) { var innerException = ex.InnerException ?? ex; _logger.Log(_logEntryBuilder.BuildExceptionLogEntry(className, methodName, args, innerException)); throw innerException; } }