Esempio n. 1
0
        private static PredyMethodCallExpression SerializeMethodCall(MethodCallExpression exp)
        {
            if (exp.Object is MemberExpression memberFromObject)
            {
                PredyMethodCallExpression methodPredy = new PredyMethodCallExpression
                {
                    Member     = (PredyMemberExpression)SerializeMember(memberFromObject),
                    MethodName = exp.Method.Name
                };

                foreach (Expression argExp in exp.Arguments)
                {
                    methodPredy.Arguments.Add(SerializeInternal(argExp));
                }

                return(methodPredy);
            }

            if (exp.Arguments[0] is MemberExpression)
            {
                PredyMethodCallExpression methodPredy = new PredyMethodCallExpression
                {
                    MethodName = exp.Method.Name
                };

                foreach (Expression argExp in exp.Arguments)
                {
                    methodPredy.Arguments.Add(SerializeInternal(argExp));
                }

                return(methodPredy);
            }

            throw new NotSupportedException(nameof(SerializeMethodCall));
        }
Esempio n. 2
0
        public static void WriteMethodCall(JsonWriter writer, PredyMethodCallExpression value, JsonSerializer serializer)
        {
            JObject jObject = new JObject
            {
                ["ExType"] = JToken.FromObject(PredyExpressions.MethodCall),
                [nameof(PredyMethodCallExpression.MethodName)] = JToken.FromObject(value.MethodName, serializer),
                [nameof(PredyMethodCallExpression.Member)]     = JToken.FromObject(value.Member, serializer),
                [nameof(PredyMethodCallExpression.Arguments)]  = JToken.FromObject(value.Arguments, serializer)
            };

            jObject.WriteTo(writer);
        }
Esempio n. 3
0
        private static Expression DeserializeMethodCall(PredyMethodCallExpression methodCallPredy)
        {
            Expression[] args     = methodCallPredy.Arguments.Select(DeserializeInternal).ToArray();
            Expression   memberEx = args[0];

            if (methodCallPredy.Member == null && memberEx.Type.IsGenericType)
            {
                MethodInfo method        = FindMethod(typeof(Enumerable), methodCallPredy.MethodName, args.Length);
                Type[]     genericTypes  = memberEx.Type.GenericTypeArguments;
                MethodInfo genericMethod = method.MakeGenericMethod(genericTypes);
                return(Expression.Call(genericMethod, args));
            }

            if (methodCallPredy.Member != null)
            {
                Type[] argTypes = args.Select(x => x.Type).ToArray();
                memberEx = DeserializeMember(methodCallPredy.Member);
                MethodInfo method = FindMethod(memberEx.Type, methodCallPredy.MethodName, argTypes);
                return(Expression.Call(memberEx, method, args));
            }

            throw new NotSupportedException(nameof(DeserializeMethodCall));
        }