public static IEnumerable <ModuleInfo> GetModules(Type baseType = null, ModuleInfo parentModule = null) { if (baseType == null) { // get top-level modules var searchType = typeof(DiscordModule); foreach (var moduleInfo in from t in Assembly.GetExecutingAssembly().GetTypes() where t.BaseType == searchType && t.GetConstructor(Type.EmptyTypes) != null select new ModuleInfo() { Type = t, //SubModules = GetModules(t).ToList(), Methods = GetMethods(t), Aliases = GetModuleAliases(t).ToList(), Priority = t.GetCustomAttribute <PriorityAttribute>()?.Priority ?? 0 } ) { moduleInfo.SubModules = GetModules(moduleInfo.Type, moduleInfo).ToList(); if (parentModule != null) { moduleInfo.ParentModules.Add(parentModule); } yield return(moduleInfo); } } else { // Get submodules foreach (var moduleInfo in from t in Assembly.GetExecutingAssembly().GetTypes() where t.UnderlyingSystemType != baseType && t.BaseType != null && t.GetConstructor(Type.EmptyTypes) != null && // we need a public constructor t.BaseType.IsGenericType && t.BaseType.GetGenericArguments()?.Where(x => x.Equals(baseType)).Count() >= 1 select new ModuleInfo() { Type = t, ParentType = baseType, Methods = GetMethods(t), //SubModules = GetModules(t), Aliases = GetModuleAliases(t).ToList(), Priority = t.GetCustomAttribute <PriorityAttribute>()?.Priority ?? 0 } ) { moduleInfo.SubModules = GetModules(moduleInfo.Type, moduleInfo).ToList(); if (parentModule != null) { moduleInfo.ParentModules.Add(parentModule); } yield return(moduleInfo); } } }
public static IEnumerable <ModuleMethod> EnumerateMethods(IEnumerable <ModuleInfo> modules, ModuleInfo moduleInfo = null) { var list = new List <ModuleMethod>(); if (moduleInfo == null) { foreach (var module in modules) { var methods = EnumerateMethods(modules, module); foreach (var m in methods) { list.Add(m); } } } else { foreach (var m in moduleInfo.Methods) { list.Add(m); } if (moduleInfo.SubModules != null) { foreach (var m in moduleInfo.SubModules) { foreach (var sub in EnumerateMethods(modules, m)) { list.Add(sub); } } } } return(list); }