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());
}