/// <summary> /// 遍历依赖项,遍历中,每个Module只会加载一次 /// </summary> /// <param name="moduleTypes">为引用值,填充后,在其他函数中使用</param> /// <param name="moduleType">初始的Module</param> private static void AddModuleAndDependenciesResursively(List <Type> moduleTypes, Type moduleType) { XqModule.CheckXqModuleType(moduleType); if (moduleTypes.Contains(moduleType)) { return; } moduleTypes.Add(moduleType); foreach (var dependedModuleType in FindDependedModuleTypes(moduleType)) { AddModuleAndDependenciesResursively(moduleTypes, dependedModuleType); } }
/// <summary> /// 根据<see cref="IDependedTypesProvider"/>获取<paramref name="moduleType"/>所有依赖的Module /// </summary> /// <param name="moduleType"></param> /// <returns></returns> public static List <Type> FindDependedModuleTypes(Type moduleType) { XqModule.CheckXqModuleType(moduleType); var dependencies = new List <Type>(); var dependencyDescriptors = moduleType .GetCustomAttributes() .OfType <IDependedTypesProvider>(); foreach (var descriptor in dependencyDescriptors) { foreach (var dependedModuleType in descriptor.GetDependedTypes()) { dependencies.AddIfNotContains(dependedModuleType); } } return(dependencies); }