Пример #1
0
        /// <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();
        }
Пример #2
0
        /// <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);
        }