/// <summary> /// 初始化接口参数描述 /// </summary> /// <param name="api"></param> /// <param name="parameter"></param> public ApiParameterDescriptor(ParameterInfo parameter, ApiDescriptor api) { Api = api ?? throw new ArgumentNullException(nameof(api)); Container = api.Container; Parameter = parameter ?? throw new ArgumentNullException(nameof(parameter)); Name = parameter.Name; ParameterType = parameter.ParameterType; var defattr = parameter.GetCustomAttribute <DefaultValueAttribute>(true); if (defattr != null) { DefaultValue = defattr.Value; HasDefaultValue = true; } else if (parameter.HasDefaultValue) { DefaultValue = parameter.DefaultValue; HasDefaultValue = true; } var attrs = parameter.GetCustomAttributes <ApiParameterAttribute>(); Settings = Container.Provider.ParseSetting(attrs) ?? new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase); var validations = new List <DataValidationAttribute>(); foreach (DataValidationAttribute filter in parameter.GetCustomAttributes <DataValidationAttribute>().Reverse() .Union(Parameter.Member.DeclaringType.GetTypeInfo().GetCustomAttributes <DataValidationAttribute>().Reverse()) .Union(Container.Validations.Reverse())) { if (validations.Any(a => a.Match(filter)) == false && filter.IsAllowType(ParameterType)) { validations.Add(filter); } } validations.Reverse(); DataValidations = validations.AsReadOnly(); var modifications = new List <DataModificationAttribute>(); foreach (DataModificationAttribute filter in parameter.GetCustomAttributes <DataModificationAttribute>().Reverse() .Union(Parameter.Member.DeclaringType.GetTypeInfo().GetCustomAttributes <DataModificationAttribute>().Reverse()) .Union(Container.Modifications.Reverse())) { if (modifications.Any(a => a.Match(filter)) == false && filter.IsAllowType(ParameterType)) { modifications.Add(filter); } } modifications.Reverse(); DataModifications = modifications.AsReadOnly(); }
/// <summary> /// 构建一个ApiClass描述,如果<paramref name="type"/>不是ApiClass则返回null /// </summary> /// <param name="type"></param> /// <returns></returns> internal static ApiClassDescriptor Create(Type type, ApiContainer container) { var typeInfo = type.GetTypeInfo(); if (!typeInfo.IsClass || typeInfo.IsAbstract || typeInfo.IsGenericTypeDefinition) //排除抽象类和泛型定义类型 { return(null); } if (typeInfo.DeclaredMethods.Any(m => m.IsDefined(typeof(ApiAttribute))) == false) { return(null); } var classAttrs = typeInfo.GetCustomAttributes <ApiClassAttribute>().ToArray(); var settings = container.Provider.ParseSetting(classAttrs) ?? new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase); var apiclass = new ApiClassDescriptor(type, container, settings); var propAttrs = typeInfo.DeclaredProperties .Select(it => ApiPropertyDescriptor.Create(it, apiclass)) .Where(it => it != null); apiclass._properties.AddRange(propAttrs); var apis = typeInfo.DeclaredMethods .Select(it => ApiDescriptor.Create(it, apiclass)) .Where(it => it != null); apiclass._apis.AddRange(apis); if (classAttrs.Length == 0 && apiclass._properties.Count == 0 && apiclass._apis.Count == 0) { return(null); } return(apiclass); }