protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            Check.NotNull(node, nameof(node));

            if (node.Method.DeclaringType == typeof(string))
            {
                switch (node.Method.Name)
                {
                case "Contains":
                {
                    var exp = ((LambdaExpression)MakeExpression(s => s.IndexOf(DummyString, _comparer) > -1)).Body;
                    exp = new ReplacingVisitor(((dynamic)exp).Left.Arguments[0], ((dynamic)node).Arguments[0]).Visit(exp);
                    exp = new ReplacingVisitor(((dynamic)exp).Left.Object, ((dynamic)node).Object).Visit(exp);
                    return(exp);
                }

                case "StartsWith":
                {
                    var exp = ((LambdaExpression)MakeExpression(s => s.IndexOf(DummyString, _comparer) == 0)).Body;
                    exp = new ReplacingVisitor(((dynamic)exp).Left.Arguments[0], ((dynamic)node).Arguments[0]).Visit(exp);
                    exp = new ReplacingVisitor(((dynamic)exp).Left.Object, ((dynamic)node).Object).Visit(exp);
                    return(exp);
                }

                case "EndsWith":
                {
                    var exp = ((LambdaExpression)MakeExpression(s => s.EndsWith(DummyString, _comparer))).Body;
                    exp = new ReplacingVisitor(((dynamic)exp).Arguments[0], ((dynamic)node).Arguments[0]).Visit(exp);
                    exp = new ReplacingVisitor(((dynamic)exp).Object, ((dynamic)node).Object).Visit(exp);
                    return(exp);
                }

                case "Equals":
                {
                    var exp = ((LambdaExpression)MakeExpression(s => s.Equals(DummyString, _comparer))).Body;
                    exp = new ReplacingVisitor(((dynamic)exp).Arguments[0], ((dynamic)node).Arguments[0]).Visit(exp);
                    exp = new ReplacingVisitor(((dynamic)exp).Object, ((dynamic)node).Object).Visit(exp);
                    return(exp);
                }
                }
            }

            return(base.VisitMethodCall(node));
        }
        protected override Expression VisitBinary(BinaryExpression node)
        {
            if (node.Left.Type == typeof(string) && node.Right.Type == typeof(string))
            {
                if (node.NodeType == ExpressionType.Equal)
                {
                    var exp = ((LambdaExpression)MakeExpression(s => s.Equals(DummyString, _comparer))).Body;
                    exp = new ReplacingVisitor(((dynamic)exp).Arguments[0], ((dynamic)node).Left).Visit(exp);
                    exp = new ReplacingVisitor(((dynamic)exp).Object, ((dynamic)node).Right).Visit(exp);
                    return(exp);
                }

                if (node.NodeType == ExpressionType.NotEqual)
                {
                    var exp = ((LambdaExpression)MakeExpression(s => !s.Equals(DummyString, _comparer))).Body;
                    exp = new ReplacingVisitor(((dynamic)exp).Operand.Arguments[0], ((dynamic)node).Left).Visit(exp);
                    exp = new ReplacingVisitor(((dynamic)exp).Operand.Object, ((dynamic)node).Right).Visit(exp);
                    return(exp);
                }
            }
            return(base.VisitBinary(node));
        }