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