/// <summary>
        ///		Create a copy of the request builder with the specified request URI query parameter.
        /// </summary>
        /// <typeparam name="TContext">
        ///		The type of object used by the request when resolving deferred template parameters.
        /// </typeparam>
        /// <param name="request">
        ///		The HTTP request.
        /// </param>
        /// <param name="name">
        ///		The parameter name.
        /// </param>
        /// <param name="valueProvider">
        ///		Delegate that, given the current context, returns the parameter value (cannot be <c>null</c>).
        /// </param>
        /// <returns>
        ///		The new <see cref="HttpRequest{TContext}"/>.
        /// </returns>
        public static HttpRequest <TContext> WithQueryParameterFromProvider <TContext>(this HttpRequest <TContext> request, string name, IValueProvider <TContext, object> valueProvider)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (String.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentException("Argument cannot be null, empty, or composed entirely of whitespace: 'name'.", nameof(name));
            }

            if (valueProvider == null)
            {
                throw new ArgumentNullException(nameof(valueProvider));
            }

            return(request.Clone(properties =>
            {
                properties[nameof(HttpRequest.QueryParameters)] = request.QueryParameters.SetItem(
                    key: name,
                    value: valueProvider.Convert().ValueToString()
                    );
            }));
        }