Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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);
        }