/// <summary> /// 启动代码生成 /// </summary> public void Start() { if (string.IsNullOrEmpty(ProjectPath) || !Directory.Exists(ProjectPath)) { Messages.Add("项目路径不存在 : " + ProjectPath); } else { try { if (IsAutoCSerCodeGenerator || IsCustomCodeGenerator) { run(new CSharper()); } else { KeyValue <Type, GeneratorAttribute>[] generators = (CustomConfig.Default.IsAutoCSer ? CurrentAssembly.GetTypes() : NullValue <Type> .Array) .concat(CustomConfig.Assembly == null ? null : CustomConfig.Assembly.GetTypes()) .getFind(type => !type.IsInterface && !type.IsAbstract && typeof(IGenerator).IsAssignableFrom(type)) .GetArray(type => new KeyValue <Type, GeneratorAttribute>(type, type.customAttribute <GeneratorAttribute>())) .getFind(value => value.Value != null && value.Value.IsAuto).ToArray(); if (generators.Length != 0) { generators = generators.sort((left, right) => string.CompareOrdinal(left.Key.FullName, right.Key.FullName)); HashSet <Type> types = generators.getHash(value => value.Key); KeyValue <Type, Type>[] depends = generators .getFind(value => value.Value.DependType != null && types.Contains(value.Value.DependType)) .GetArray(value => new KeyValue <Type, Type>(value.Key, value.Value.DependType)); foreach (Type type in AutoCSer.Algorithm.TopologySort.Sort(depends, types, true)) { run(type.Assembly.CreateInstance(type.FullName) as IGenerator); } } if (CustomConfig.Default.IsAutoCSer) { foreach (Type type in Types) { if (!type.IsGenericType && !type.IsInterface && !type.IsEnum) { foreach (Metadata.MethodIndex methodInfo in Metadata.MethodIndex.GetMethods <TestMethodAttribute>(type, MemberFilters.Static, false, true, false)) { MethodInfo method = methodInfo.Method; if (method.IsGenericMethod) { //isTest = false; Messages.Message("测试用例不能是泛型函数 " + method.fullName()); } else { Type returnType = method.ReturnType; if ((returnType == typeof(bool) || returnType == typeof(void)) && method.GetParameters().Length == 0) { try { object returnValue = method.Invoke(null, null); if (method.ReturnType == typeof(bool) && !(bool)returnValue) { //isTest = false; Messages.Message("测试用例调用失败 " + method.fullName()); } } catch (Exception error) { Messages.Message(error.ToString()); } } } } } } } } } catch (Exception error) { if (CustomConfig.Assembly == null) { Messages.Add(error); } else { Messages.Add(CustomConfig.Assembly.FullName + "\r\n" + error.ToString()); } } finally { Coder.Output(this); } } }