Index: Src/GoogleApis/Apis/Requests/Parameters/ParameterUtils.cs
===================================================================
new file mode 100644
--- /dev/null
+++ b/Src/GoogleApis/Apis/Requests/Parameters/ParameterUtils.cs
@@ -0,0 +1,129 @@
+/*
+Copyright 2013 Google Inc
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Linq;
+using System.Reflection;
+
+using Google.Apis.Util;
+
+namespace Google.Apis.Requests.Parameters
+{
+ ///
+ /// Utility class for iterating on properties in a request object.
+ ///
+ public static class ParameterUtils
+ {
+ ///
+ /// Creates a with all the specified parameters in
+ /// input request. It uses reflection to iterate over all properties with
+ /// attribute.
+ ///
+ ///
+ /// A request object which contains properties with
+ /// attribute. Those properties will be serialized
+ /// to the returned .
+ ///
+ ///
+ /// A which contains the all the given object required
+ /// values
+ ///
+ public static FormUrlEncodedContent CreateFormUrlEncodedContent(object request)
+ {
+ IList> list = new List>();
+ IterateParameters(request, (type, name, value) =>
+ {
+ list.Add(new KeyValuePair(name, value.ToString()));
+ });
+ return new FormUrlEncodedContent(list);
+ }
+
+ ///
+ /// Creates a parameter dictionary by using reflection to iterate over all properties with
+ /// attribute.
+ ///
+ ///
+ /// A request object which contains properties with
+ /// attribute. Those properties will be set
+ /// in the output dictionary
+ ///
+ public static IDictionary CreateParameterDictionary(object request)
+ {
+ var dict = new Dictionary();
+ IterateParameters(request, (type, name, value) =>
+ {
+ dict.Add(name, value);
+ });
+ return dict;
+ }
+
+ ///
+ /// Sets query parameters in the given builder with all all properties with the
+ /// attribute.
+ ///
+ /// The request builder
+ ///
+ /// A request object which contains properties with
+ /// attribute. Those properties will be set in the
+ /// given request builder object
+ ///
+ public static void InitParameters(RequestBuilder builder, object request)
+ {
+ IterateParameters(request, (type, name, value) =>
+ {
+ builder.AddParameter(type, name, value.ToString());
+ });
+ }
+
+ ///
+ /// Iterates over all properties in the request object and invokes
+ /// the specified action for each of them.
+ ///
+ /// A request object
+ /// An action to invoke which gets the parameter type, name and its value
+ private static void IterateParameters(object request, Action action)
+ {
+ // Use reflection to build the parameter dictionary.
+ foreach (PropertyInfo property in request.GetType().GetProperties(BindingFlags.Instance |
+ BindingFlags.Public))
+ {
+ // Retrieve the RequestParameterAttribute.
+ RequestParameterAttribute attribute =
+ property.GetCustomAttributes(typeof(RequestParameterAttribute), false).FirstOrDefault() as
+ RequestParameterAttribute;
+ if (attribute == null)
+ {
+ continue;
+ }
+
+ // Get the name of this parameter from the attribute, if it doesn't exist take a lower-case variant of
+ // property name.
+ string name = attribute.Name ?? property.Name.ToLower();
+
+ var propertyType = property.PropertyType;
+ var value = property.GetValue(request, null);
+
+ // Call action with the type name and value.
+ if (propertyType.IsValueType || value != null)
+ {
+ action(attribute.Type, name, value);
+ }
+ }
+ }
+ }
+}