/// <summary>
        /// Given an object, attempt to serialize it into a form suitable for URL Encoding
        /// </summary>
        /// <remarks>Currently only supports objects which implement IDictionary</remarks>
        /// <param name="body">Object to attempt to serialize</param>
        /// <returns>Key/value collection suitable for URL encoding</returns>
        protected virtual IEnumerable <KeyValuePair <string, string?> > SerializeBodyForUrlEncoding(object body)
        {
            if (body == null)
            {
                return(Enumerable.Empty <KeyValuePair <string, string?> >());
            }

            if (DictionaryIterator.CanIterate(body.GetType()))
            {
                return(this.TransformDictionaryToCollectionOfKeysAndValues(body));
            }
            else
            {
                throw new ArgumentException("BodySerializationMethod is UrlEncoded, but body does not implement IDictionary or IDictionary<TKey, TValue>", nameof(body));
            }
        }
 /// <summary>
 /// Takes an IDictionary or IDictionary{TKey, TValue}, and emits KeyValuePairs for each key
 /// Takes account of IEnumerable values, null values, etc
 /// </summary>
 /// <param name="dictionary">Dictionary to transform</param>
 /// <returns>A set of KeyValuePairs</returns>
 protected virtual IEnumerable <KeyValuePair <string, string?> > TransformDictionaryToCollectionOfKeysAndValues(object dictionary)
 {
     foreach (var kvp in DictionaryIterator.Iterate(dictionary))
     {
         if (kvp.Value != null && !(kvp.Value is string) && kvp.Value is IEnumerable enumerable)
         {
             foreach (object individualValue in enumerable)
             {
                 string?stringValue = this.ToStringHelper(individualValue);
                 yield return(new KeyValuePair <string, string?>(this.ToStringHelper(kvp.Key) !, stringValue));
             }
         }
         else if (kvp.Value != null)
         {
             yield return(new KeyValuePair <string, string?>(this.ToStringHelper(kvp.Key) !, this.ToStringHelper(kvp.Value)));
         }
     }
 }