示例#1
0
        /// <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;
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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;
        }
示例#4
0
        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));
        }
示例#5
0
        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);
        }
示例#6
0
        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;
        }