/// <summary>Initializes a new instance of the <see cref="ArgumentInfo" /> class.</summary> /// <param name="parameter">Actual underlying parameter.</param> /// <param name="source">Parameter source.</param> /// <param name="urlTemplate">Relative URL template of this parameter.</param> /// <param name="variableName">Variable name in the template for given argument</param> public ArgumentInfo(ParameterInfo parameter, ParameterSourceAttribute source, string urlTemplate, string variableName) : base(parameter, urlTemplate, variableName) { if (source == null) { throw new ArgumentNullException("source"); } Source = source; }
/// <summary> /// Creates parameter information array objects for the specified action method /// </summary> private ActionParameter[] BuildParameters(MethodInfo method) { ParameterInfo[] parameters = method.GetParameters(); //result length is same with method's real parameter array length ActionParameter[] result = new ActionParameter[parameters.Length]; for (int i = 0; i < parameters.Length; i++) { ParameterInfo parameter = parameters[i]; ParameterSourceAttribute attr = parameter.GetCustomAttribute <ParameterSourceAttribute>(true); string from; //if source is specified, set from to specified parameter name. //but for Body types, there is no parameter name but serialization method. if (attr != null) { if (attr.Source == ParameterSource.Body) { from = ((FromBodyAttribute)attr).Type.ToString().ToLower(); } else { from = string.IsNullOrEmpty(attr.Name) ? parameter.Name : attr.Name; } } else { from = parameter.Name; } ActionParameter item = new ActionParameter { ParameterType = parameter.ParameterType, ParameterName = parameter.Name, FromName = from, Index = i, Source = attr != null ? attr.Source : ParameterSource.None, Nullable = Nullable.GetUnderlyingType(parameter.ParameterType) != null, IsClass = parameter.ParameterType.IsClass && parameter.ParameterType != typeof(string) }; if (item.IsClass) { PropertyInfo[] properties = parameter.ParameterType.GetProperties(); foreach (PropertyInfo property in properties) { item.ClassProperties.Add(property.Name, property); } } result[i] = item; } return(result); }
private static OperationInfo <Verb> CreateOperation(MethodInfo method, Verb verb) { string queryString = String.Empty; string uriTemplate = null; IList <ArgumentInfo> arguments = new List <ArgumentInfo>(); foreach (var parameter in method.GetParameters()) { if (parameter.IsOut) { continue; } string parameterTemplate = null; ParameterSourceAttribute source = null; if (parameter.ParameterType == typeof(Guid)) { source = FromUrlAttribute.For(parameter); uriTemplate += (parameterTemplate = "/" + parameter.Name + "/{?value}"); } else if (parameter.ParameterType.IsValueType) { source = FromQueryStringAttribute.For(parameter); queryString += (parameterTemplate = "&" + parameter.Name + "={?value}"); } else if (!parameter.ParameterType.IsValueType) { source = FromBodyAttribute.For(parameter); } arguments.Add(new ArgumentInfo(parameter, source, parameterTemplate, (parameterTemplate != null ? parameter.Name : null))); } if (queryString.Length > 0) { uriTemplate += "?" + queryString.Substring(1); } return(new OperationInfo <Verb>(method, (HttpUrl)UrlParser.Parse("/"), uriTemplate, new Regex(".*"), verb, arguments.ToArray()).WithSecurityDetailsFrom(method)); }
internal static bool CreateParameterTemplateRegex(this ParameterInfo parameter, ParameterSourceAttribute parameterSource, out string parameterTemplateRegex) { parameterTemplateRegex = null; var methodInfo = typeof(MemberInfoExtensions).GetMethods(BindingFlags.Static | BindingFlags.NonPublic) .FirstOrDefault(item => (item.Name == "CreateParameterTemplateRegex") && (item.GetParameters().Length > 1) && (item.GetParameters()[1].ParameterType == parameterSource.GetType())); if (methodInfo == null) { return(false); } var arguments = new object[] { parameter, parameterSource, null }; methodInfo.Invoke(null, arguments); parameterTemplateRegex = (string)arguments[2]; return(true); }
internal static bool CreateParameterTemplateRegex(this ParameterInfo parameter, ParameterSourceAttribute parameterSource, out string parameterTemplateRegex) { parameterTemplateRegex = null; var methodInfo = typeof(MemberInfoExtensions).GetMethods(BindingFlags.Static | BindingFlags.NonPublic) .FirstOrDefault(item => (item.Name == "CreateParameterTemplateRegex") && (item.GetParameters().Length > 1) && (item.GetParameters()[1].ParameterType == parameterSource.GetType())); if (methodInfo == null) { return false; } var arguments = new object[] { parameter, parameterSource, null }; methodInfo.Invoke(null, arguments); parameterTemplateRegex = (string)arguments[2]; return true; }