Exemple #1
0
        public ClassUnit Parse(bool earseAsync = true)
        {
            var nameSpaceName = ResponseType.GetCustomAttribute <WithNameSpaceAttribute>()?.NameSpace;

            if (nameSpaceName == null)
            {
                throw new ArgumentNullException("类型不存在特性WithNameSpaceAttribute");
            }
            var classOpts    = ResponseType.GetCustomAttributes <WithClassOptionAttribute>();
            var classOptions = new List <string>(classOpts != null ? classOpts.Count() : 5);

            if (classOpts != null)
            {
                classOptions.AddRange(classOpts.Select(c => c.GetOption()));
            }
            var controllerName = ResponseType.GetCustomAttribute <ControllerNameAttribute>()?.Name;

            if (controllerName == null)
            {
                controllerName = ResponseType.Name.Replace("Response", "Controller");
            }
            var methodUnits = new List <MethodUnit>(MethodInfos.Count());

            foreach (var item in MethodInfos)
            {
                var name = item.Name;
                if (earseAsync && name != "Async")
                {
                    name = name.Replace("Async", string.Empty);
                }
                var options = item.GetCustomAttributes <WithMethodOptionAttribute>().Select(m => m.GetOption());
                var pars    = item.GetParameters();
                var isAsync = item.GetCustomAttribute <AsyncStateMachineAttribute>() != null;
                var pus     = new List <ParamterUnit>(pars.Length);
                foreach (var p in pars)
                {
                    var parName = p.Name;
                    var parType = p.ParameterType.Name;
                    if (p.ParameterType.IsGenericType && p.ParameterType.GetGenericTypeDefinition() == (typeof(Nullable <>)))
                    {
                        parType = p.ParameterType.GetGenericArguments()[0].Name + "?";
                    }
                    if (p.HasDefaultValue)
                    {
                        if (p.ParameterType.IsClass)
                        {
                            parName += "=null";
                        }
                        else
                        {
                            parName += $"={p.DefaultValue}";
                        }
                    }
                    var parOptions = p.GetCustomAttributes <WithParamtersAttribute>().Select(par => par.GetOption());
                    pus.Add(new ParamterUnit(parName, parType, parOptions));
                }
                var codes = pars.SelectMany(p => p.GetCustomAttributes <CodeAttribute>());
                methodUnits.Add(new MethodUnit(name, isAsync, options, codes, pus));
            }
            return(new ClassUnit(ResponseType.Name, nameSpaceName, controllerName, classOptions, methodUnits));
        }