private static Func <Closure, object> Call(MethodCallExpression methodCallExpression, ConstantExpression[] constantsExprs, ParameterExpression[] localsExprs) { var targetFn = Expression(methodCallExpression.Object, constantsExprs, localsExprs); var argsFns = methodCallExpression.Arguments.Select(e => Expression(e, constantsExprs, localsExprs)).ToArray(); var invokeFn = MethodCall.TryCreate(methodCallExpression.Method); if (invokeFn != null) { return(closure => { return invokeFn(closure, argsFns); }); } else { return(closure => { var target = targetFn(closure); var args = new object[argsFns.Length]; for (var i = 0; i < args.Length; i++) { args[i] = argsFns[i](closure); } return methodCallExpression.Method.Invoke(target, args); }); } }