/// <summary> /// The visit binary. /// </summary> /// <param name="b"> /// The b. /// </param> /// <returns> /// The <see cref="Expression" />. /// </returns> protected override Expression VisitBinary(BinaryExpression expression) { BinaryType op; if (!BinaryType.TryParse(expression.NodeType.ToString(), out op)) { if (expression.NodeType == ExpressionType.OrElse) { op = BinaryType.Or; } else if (expression.NodeType == ExpressionType.AndAlso) { op = BinaryType.And; } else { throw new Exception(expression.NodeType.ToString()); } } var node = new QNode() { Type = NodeType.Binary, Value = op }; this.Visit(expression.Left); node.Left = this.Context.Pop(); this.Visit(expression.Right); node.Right = this.Context.Pop(); this.Context.Push(node); return(expression); }
/// <summary> /// The visit method call. /// </summary> /// <param name="m"> /// The memberAccess. /// </param> /// <returns> /// The <see cref="Expression" />. /// </returns> protected override Expression VisitMethodCall(MethodCallExpression m) { QNode node; MethodType method; BinaryType binary; if (MethodType.TryParse(m.Method.Name, out method)) { node = new QNode() { Type = NodeType.Method, Value = method }; } else if (BinaryType.TryParse(m.Method.Name, out binary)) { node = new QNode() { Type = NodeType.Binary, Value = binary }; } else { throw new Exception(m.Method.Name); } if (m.Object != null) { if (m.Arguments[0].NodeType == ExpressionType.MemberAccess) { if (typeof(IConstantPlaceHolder).IsAssignableFrom( ((MemberExpression)m.Arguments[0]).Expression.Type)) { this.Visit(m.Object); node.Left = this.Context.Pop(); this.Visit(m.Arguments[0]); node.Right = this.Context.Pop(); } else { //node = new CallNode("In"); //this.Visit(m.Arguments[0]); //node.Left = this.Context.Pop(); //this.Visit(m.Object); //node.Right = this.Context.Pop(); } } else { this.Visit(m.Object); node.Left = this.Context.Pop(); this.Visit(m.Arguments[0]); node.Right = this.Context.Pop(); } } else { this.Visit(m.Arguments[0]); node.Left = this.Context.Pop(); if (m.Arguments.Count > 1) { this.Visit(m.Arguments[1]); node.Right = this.Context.Pop(); } } this.Context.Push(node); return(m); }