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