private IExpressionNode VisitMethodCall(IMethodCallExpressionNode methodCall) { _isMulti = true; if (methodCall.Target != null) { return(methodCall); } BindingMemberExpressionNode member = GetOrAddBindingMember(string.Empty, (s, i) => new BindingMemberExpressionNode(string.Empty, s, i)); return(new MethodCallExpressionNode(member, methodCall.Method, methodCall.Arguments, methodCall.TypeArgs).Accept(this)); }
private Expression BuildMethodCall(IMethodCallExpressionNode methodCall) { if (methodCall.Target == null) { throw BindingExceptionManager.UnexpectedExpressionNode(methodCall); } var typeArgs = GetTypes(methodCall.TypeArgs); var hasLambda = methodCall.Arguments .OfType <ILambdaExpressionNode>() .Any(); if (methodCall.Target.NodeType == ExpressionNodeType.DynamicMember) { if (hasLambda) { throw BindingExceptionManager.UnexpectedExpressionNode(methodCall); } var parameters = methodCall.Arguments .Select(node => ExpressionReflectionManager.ConvertIfNeed(BuildExpression(node), typeof(object), false)); var arrayArg = Expression.NewArrayInit(typeof(object), parameters); Type returnType = typeof(object); var dynamicMethod = BindingServiceProvider .ResourceResolver .ResolveMethod(methodCall.Method, _dataContext, false); if (dynamicMethod != null) { returnType = dynamicMethod.GetReturnType(arrayArg.Expressions.ToArrayEx(expression => expression.Type), typeArgs, DataContext); } return(ExpressionReflectionManager.ConvertIfNeed(Expression.Call(_thisExpression, ProxyMethod, Expression.Constant(methodCall.Method), DataContextParameter, Expression.Constant(typeArgs, typeof(IList <Type>)), arrayArg), returnType, false)); } var target = BuildExpression(methodCall.Target); var type = GetTargetType(ref target); var targetData = new ArgumentData(methodCall.Target, target, type); var args = methodCall .Arguments .ToArrayEx(node => new ArgumentData(node, node.NodeType == ExpressionNodeType.Lambda ? null : BuildExpression(node), null)); var method = targetData .FindMethod(methodCall.Method, typeArgs, args, BindingServiceProvider.ResourceResolver.GetKnownTypes(), target == null); return(GenerateMethodCall(method, targetData, args)); }
private Expression BuildMethodCall(IMethodCallExpressionNode methodCall) { if (methodCall.Target == null) { throw BindingExceptionManager.UnexpectedExpressionNode(methodCall); } var typeArgs = GetTypes(methodCall.TypeArgs); var hasLambda = methodCall.Arguments .OfType <ILambdaExpressionNode>() .Any(); if (methodCall.Target.NodeType == ExpressionNodeType.DynamicMember) { if (hasLambda) { throw BindingExceptionManager.UnexpectedExpressionNode(methodCall); } var parameters = methodCall.Arguments .Select(node => ExpressionReflectionManager.ConvertIfNeed(BuildExpression(node), typeof(object), false)); var arrayArg = Expression.NewArrayInit(typeof(object), parameters); Type returnType = typeof(object); var dynamicMethod = BindingServiceProvider .ResourceResolver .ResolveMethod(methodCall.Method, _dataContext, false); if (dynamicMethod != null) { returnType = dynamicMethod.GetReturnType(arrayArg.Expressions.ToArrayEx(expression => expression.Type), typeArgs, _dataContext); } return(ExpressionReflectionManager.ConvertIfNeed(Expression.Call(_thisExpression, ProxyMethod, Expression.Constant(methodCall.Method), DataContextParameter, Expression.Constant(typeArgs, typeof(IList <Type>)), arrayArg), returnType, false)); } var target = BuildExpression(methodCall.Target); var type = GetTargetType(ref target); var targetData = new ArgumentData(methodCall.Target, target, type, target == null); var args = methodCall .Arguments .ToArrayEx(node => new ArgumentData(node, node.NodeType == ExpressionNodeType.Lambda ? null : BuildExpression(node), null, false)); var types = new List <Type>(BindingServiceProvider.ResourceResolver.GetKnownTypes()) { typeof(BindingReflectionExtensions) }; var methods = targetData.FindMethod(methodCall.Method, typeArgs, args, types, target == null); var exp = TryGenerateMethodCall(methods, targetData, args); if (exp != null) { return(exp); } var arrayArgs = new Expression[args.Length]; for (int i = 0; i < args.Length; i++) { var data = args[i]; if (data.IsLambda || data.Expression == null) { throw BindingExceptionManager.InvalidBindingMember(type, methodCall.Method); } arrayArgs[i] = ExpressionReflectionManager.ConvertIfNeed(data.Expression, typeof(object), false); } if (target == null) { throw BindingExceptionManager.InvalidBindingMember(type, methodCall.Method); } return(Expression.Call(InvokeMemberDynamicMethod, ExpressionReflectionManager.ConvertIfNeed(target, typeof(object), false), Expression.Constant(methodCall.Method), Expression.NewArrayInit(typeof(object), arrayArgs), Expression.Constant(typeArgs), Expression.Constant(new MethodInvoker()), DataContextParameter)); }
private IExpressionNode VisitMethodCall(IMethodCallExpressionNode methodCall) { _isMulti = true; if (methodCall.Target != null) return methodCall; BindingMemberExpressionNode member = GetOrAddBindingMember(string.Empty, (s, i) => new BindingMemberExpressionNode(string.Empty, s, i)); return new MethodCallExpressionNode(member, methodCall.Method, methodCall.Arguments, methodCall.TypeArgs).Accept(this); }