private string VisitBinary(BinaryExpression expression) { ExceptionUtils.MustBeTrue(expression != null); string operatorText; switch (expression.NodeType) { case ExpressionType.Multiply: operatorText = "*"; break; case ExpressionType.Add: operatorText = "+"; break; case ExpressionType.Subtract: operatorText = "-"; break; default: throw new NotImplementedException(expression.GetType().FullName); } var wrapWithParens = this.operatorStack.Count > 0 && this.operatorStack.Peek() != expression.NodeType; string format = wrapWithParens ? "({0} {1} {2})" : "{0} {1} {2}"; try { this.operatorStack.Push(expression.NodeType); return string.Format(format, Visit(expression.Left), operatorText, Visit(expression.Right)); } finally { this.operatorStack.Pop(); } }