예제 #1
0
        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);
        }