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)); }
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); }
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)); }