/// <summary>
        /// Visits <paramref name="expressions"/> and replaces <see cref="ParameterExpression"/> by <paramref name="newValues"/> performing match by <see cref="Expression.Type"/>
        /// </summary>
        internal static IEnumerable <Expression> ReplaceParameters(IEnumerable <Expression> expressions, IList <Expression> newValues)
        {
            return(newValues.Count != 0
                ? PerformReplacement()
                : expressions);

            IEnumerable <Expression> PerformReplacement()
            {
                var visitor = new ParameterReplacerVisitor(newValues);

                return(expressions.Where(o => o != null).Select(expression => visitor.Visit(expression)));
            }
        }
        internal static Expression ReplaceParameters(Expression expression, params Expression[] newValues)
        {
            var visitor = new ParameterReplacerVisitor(newValues);

            return(visitor.Visit(expression));
        }