/// <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)); } }
/// <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(); }
/// <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(); }