private static string BuildHttpQuery(object parameter, Func<string, string> encode)
{
if (parameter == null)
return "null";
if (parameter is string)
return (string)parameter;
if (parameter is bool)
return (bool)parameter ? "true" : "false";
if (parameter is int || parameter is long ||
parameter is float || parameter is double || parameter is decimal ||
parameter is byte || parameter is sbyte ||
parameter is short || parameter is ushort ||
parameter is uint || parameter is ulong)
return parameter.ToString();
if (parameter is Uri)
return parameter.ToString();
// todo: IEnumerable<KeyValuePair<T1,T2>> and IEnumerable<Tuple<T1, T2>>
var sb = new StringBuilder();
if (parameter is IEnumerable<KeyValuePair<string, object>>)
{
foreach (var kvp in (IEnumerable<KeyValuePair<string, object>>)parameter)
sb.AppendFormat("{0}={1}&", encode(kvp.Key), encode(BuildHttpQuery(kvp.Value, encode)));
}
else if (parameter is IEnumerable<KeyValuePair<string, string>>)
{
foreach (var kvp in (IEnumerable<KeyValuePair<string, string>>)parameter)
sb.AppendFormat("{0}={1}&", encode(kvp.Key), encode(kvp.Value));
}
else if (parameter is IEnumerable)
{
foreach (var obj in (IEnumerable)parameter)
sb.AppendFormat("{0},", encode(BuildHttpQuery(obj, encode)));
}
else if (parameter is DateTime)
{
return DateTimeConvertor.ToIso8601FormattedDateTime((DateTime)parameter);
}
else
{
IDictionary<string, FacebookMediaObject> mediaObjects;
IDictionary<string, FacebookMediaStream> mediaStreams;
var dict = ToDictionary(parameter, out mediaObjects, out mediaStreams);
if (mediaObjects.Count > 0 || mediaStreams.Count > 0)
throw new InvalidOperationException("Parameter can contain attachements (FacebookMediaObject/FacebookMediaStream) only in the top most level.");
return BuildHttpQuery(dict, encode);
}
if (sb.Length > 0)
sb.Length--;
return sb.ToString();
}