/// <summary>
        /// 请求Api的返回描述
        /// </summary>
        /// <param name="method">方法信息</param>
        /// <param name="interfaceType">接口类型</param>
        /// <exception cref="ArgumentNullException"></exception>
        public ApiReturnDescriptor(MethodInfo method, Type interfaceType)
        {
            if (method == null)
            {
                throw new ArgumentNullException(nameof(method));
            }

            var type = method.ReturnType.IsGenericType
                ? method.ReturnType.GetGenericArguments().First()
                : typeof(HttpResponseMessage);

            var dataType = new ApiDataTypeDescriptor(type);

            this.ReturnType = method.ReturnType;
            this.DataType   = dataType;
            this.Attributes = method
                              .GetAttributes <IApiReturnAttribute>()
                              .Concat(interfaceType.GetAttributes <IApiReturnAttribute>(inclueBases: true))
                              .Concat(GetDefaultAttributes(dataType))
                              .Distinct(MultiplableComparer <IApiReturnAttribute> .Default)
                              .OrderBy(item => item.OrderIndex)
                              .Where(item => item.Enable)
                              // 最后步骤为比较媒体类型
                              .Distinct(MediaTypeComparer.Default)
                              .ToReadOnlyList();
        }
        /// <summary>
        /// 获取默认特性
        /// </summary>
        /// <param name="dataType"></param>
        /// <returns></returns>
        private static IEnumerable <IApiReturnAttribute> GetDefaultAttributes(ApiDataTypeDescriptor dataType)
        {
            const double acceptQuality = 0.001;

            if (dataType.IsRawType == true)
            {
                yield return(new RawReturnAttribute(acceptQuality));
            }
            else
            {
                yield return(new JsonReturnAttribute(acceptQuality));

                yield return(new XmlReturnAttribute(acceptQuality));

                yield return(new NoneReturnAttribute(acceptQuality));
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// 请求Api的返回描述
        /// </summary>
        /// <param name="returnType">方法返回类型</param>
        /// <param name="methodAttributes">方法的特性</param>
        /// <param name="interfaceAttributes">接口的特性</param>
        public ApiReturnDescriptor(Type returnType, IEnumerable <Attribute> methodAttributes, IEnumerable <Attribute> interfaceAttributes)
        {
            var type = returnType.IsGenericType
                ? returnType.GetGenericArguments().First()
                : typeof(HttpResponseMessage);

            var dataType = new ApiDataTypeDescriptor(type);

            this.ReturnType = returnType;
            this.DataType   = dataType;
            this.Attributes = methodAttributes
                              .OfType <IApiReturnAttribute>()
                              .Concat(interfaceAttributes.OfType <IApiReturnAttribute>())
                              .Concat(GetDefaultAttributes(dataType))
                              .Distinct(MultiplableComparer <IApiReturnAttribute> .Default)
                              .OrderBy(item => item.OrderIndex)
                              .Where(item => item.Enable)
                              // 最后步骤为比较媒体类型
                              .Distinct(MediaTypeComparer.Default)
                              .ToReadOnlyList();
        }
Exemplo n.º 4
0
        /// <summary>
        /// 请求Api的返回描述
        /// </summary>
        /// <param name="method">方法信息</param>
        /// <exception cref="ArgumentNullException"></exception>
        public ApiReturnDescriptor(MethodInfo method)
        {
            if (method == null)
            {
                throw new ArgumentNullException(nameof(method));
            }

            var type = method.ReturnType.IsGenericType ?
                       method.ReturnType.GetGenericArguments().FirstOrDefault() :
                       typeof(HttpResponseMessage);

            var dataType = new ApiDataTypeDescriptor(type);

            this.ReturnType       = method.ReturnType;
            this.DataType         = dataType;
            this.IsTaskDefinition = method.ReturnType.IsInheritFrom <Task>();
            this.Attributes       = method
                                    .FindDeclaringAttributes <IApiReturnAttribute>(true)
                                    .Concat(GetDefaultAttributes(dataType))
                                    .Distinct(new MultiplableComparer <IApiReturnAttribute>())
                                    .OrderBy(item => item.OrderIndex)
                                    .Where(item => item.Enable)
                                    .ToReadOnlyList();
        }