/// <summary>
        /// 获取所有参数的描述信息
        /// </summary>
        /// <param name="actionDescriptor"></param>
        /// <returns></returns>
        public static IEnumerable <ParameterDisplay> Parameters(this MethodDescriptor actionDescriptor)
        {
            var pas = actionDescriptor.Method.GetCustomAttributes <ParameterDisplayAttribute>();

            return(actionDescriptor.Method.GetParameters()
                   .Select(t => {
                if (!pas.Any(p => p.Name == t.Name))
                {
                    return new ParameterDisplay()
                    {
                        name = t.Name,
                        type = t.ParameterType.Name,
                        required = !t.IsOptional
                    }
                }
                ;
                var arribute = pas.FirstOrDefault(p => p.Name == t.Name);
                var propertys = new ParameterDisplay[] { };
                if (t.ParameterType.IsArray)
                {
                    propertys = t.ParameterType.GetElementType().GetProperties()
                                .Select(filed =>
                    {
                        var p = filed.GetCustomAttribute <ParameterDisplayAttribute>(true);
                        if (p == null)
                        {
                            return new ParameterDisplay()
                            {
                                name = filed.Name,
                                type = filed.PropertyType.Name
                            }
                        }
                        ;
                        return new ParameterDisplay()
                        {
                            name = p.Name,
                            type = p.Type,
                            required = p.Required,
                            @default = p.Default,
                            display = p.Display
                        };
                    }).ToArray();
                }
                return new ParameterDisplay()
                {
                    name = arribute.Name,
                    type = arribute.Type,
                    required = arribute.Required,
                    @default = arribute.Default,
                    display = arribute.Display,
                    Propertys = propertys
                };
            }));
        }
        /// <summary>
        /// 返回值描述
        /// </summary>
        /// <param name="actionDescriptor"></param>
        /// <returns></returns>
        public static ParameterDisplay ResultParameters(this MethodDescriptor actionDescriptor)
        {
            var returnType = actionDescriptor.Method.ReturnType;
            var display    = returnType.GetCustomAttribute <ParameterDisplayAttribute>();

            if (display == null)
            {
                display = new ParameterDisplayAttribute()
                {
                    Name = actionDescriptor.Method.ReturnParameter.Name,
                    Type = actionDescriptor.Method.ReturnType.Name
                }
            }
            ;
            var returnParameter = new ParameterDisplay()
            {
                name     = display.Name,
                @default = display.Default,
                display  = display.Display,
                required = display.Required,
                type     = display.Type
            };

            if (returnType.IsPrimitive || returnType.ReflectedType == typeof(string) || returnType.IsEnum)
            {
                return(returnParameter);
            }
            var properties = returnType.GetProperties();

            if (returnType.IsGenericType)
            {
                properties = returnType.GetGenericArguments()[0]?.GetProperties();
            }
            if (returnType.IsArray)
            {
                properties = returnType.GetElementType().GetProperties();
            }
            if (returnType == typeof(Task))
            {
                return(returnParameter);
            }
            returnParameter.Propertys = properties.Select(filed =>
            {
                var p = filed.GetCustomAttribute <ParameterDisplayAttribute>(true);
                if (p == null)
                {
                    return new ParameterDisplay()
                    {
                        name = filed.Name,
                        type = filed.PropertyType.Name
                    }
                }
                ;
                return(new ParameterDisplay()
                {
                    name = p.Name,
                    type = p.Type,
                    required = p.Required,
                    @default = p.Default,
                    display = p.Display
                });
            });
            return(returnParameter);
        }