private Ret <Result> CallPaperMethod(PaperContext context, IPaper paper, MethodInfo method, Args args, Entity form) { object result = null; try { var methodArgs = CreateParameters(context, paper, method, args, form); context.RenderContext.Sort = methodArgs.OfType <Sort>().FirstOrDefault(); context.RenderContext.Page = methodArgs.OfType <Page>().FirstOrDefault(); context.RenderContext.Filter = methodArgs.OfType <IFilter>().FirstOrDefault(); context.RenderContext.Page?.IncreaseLimit(); result = objectFactory.Invoke(paper, method, methodArgs); } catch (Exception ex) { result = Ret.Fail(ex); } var resultType = method.ReturnType; if (Is.Ret(resultType)) { resultType = TypeOf.Ret(resultType); } Ret <Result> ret; if (result == null) { // Um método que resulta "void" é considerado OK quando não emite exceção. // Um método que resulta nulo é considerado NotFound (Não encontrado). var isVoid = method.ReturnType == typeof(void); if (isVoid) { ret = Ret.OK(new Result { Value = result, ValueType = resultType }); } else { ret = Ret.NotFound(new Result { Value = result, ValueType = resultType }); } } else if (Is.Ret(result)) { ret = new Ret <Result>(); ret.Status = (RetStatus)result._Get(nameof(ret.Status)); ret.Fault = (RetFault)result._Get(nameof(ret.Fault)); ret.Value = new Result { Value = result._Get(nameof(ret.Value)), ValueType = resultType }; } else { ret = Ret.OK(new Result { Value = result, ValueType = resultType }); } return(ret); }