diff --git a/src/Discord.Net.Modules/ModuleExtensions.cs b/src/Discord.Net.Modules/ModuleExtensions.cs index 7d51ac547..a96517c06 100644 --- a/src/Discord.Net.Modules/ModuleExtensions.cs +++ b/src/Discord.Net.Modules/ModuleExtensions.cs @@ -8,15 +8,19 @@ return client; } - public static void AddModule(this DiscordClient client, T instance, string name = null, ModuleFilter filter = ModuleFilter.None) - where T : class, IModule + public static void AddModule(this DiscordClient client, IModule instance, string name = null, ModuleFilter filter = ModuleFilter.None) { - client.GetService().Add(instance, name ?? nameof(T), filter); + client.GetService().Add(instance, name, filter); } public static void AddModule(this DiscordClient client, string name = null, ModuleFilter filter = ModuleFilter.None) where T : class, IModule, new() { - client.GetService().Add(new T(), name ?? nameof(T), filter); + client.GetService().Add(name, filter); + } + public static void AddModule(this DiscordClient client, T instance, string name = null, ModuleFilter filter = ModuleFilter.None) + where T : class, IModule + { + client.GetService().Add(instance, name, filter); } public static ModuleManager GetModule(this DiscordClient client) where T : class, IModule diff --git a/src/Discord.Net.Modules/ModuleService.cs b/src/Discord.Net.Modules/ModuleService.cs index 0eadd0694..1f405a222 100644 --- a/src/Discord.Net.Modules/ModuleService.cs +++ b/src/Discord.Net.Modules/ModuleService.cs @@ -1,16 +1,21 @@ using System; using System.Collections.Generic; +using System.Linq; +using System.Reflection; namespace Discord.Modules { public class ModuleService : IService { public DiscordClient Client { get; private set; } - - public IEnumerable Modules => _modules.Values; + + private static readonly MethodInfo addMethod = typeof(ModuleService).GetTypeInfo().GetDeclaredMethods(nameof(Add)) + .Single(x => x.IsGenericMethodDefinition && x.GetParameters().Length == 3); + + public IEnumerable Modules => _modules.Values; private readonly Dictionary _modules; - public ModuleService() + public ModuleService() { _modules = new Dictionary(); } @@ -20,22 +25,29 @@ namespace Discord.Modules Client = client; } - public T Add(T module, string name, ModuleFilter filterType) + public void Add(IModule instance, string name, ModuleFilter filter) + { + Type type = instance.GetType(); + addMethod.MakeGenericMethod(type).Invoke(this, new object[] { instance, name, filter }); + } + public void Add(string name, ModuleFilter filter) + where T : class, IModule, new() + => Add(new T(), name, filter); + public void Add(T instance, string name, ModuleFilter filter) where T : class, IModule { - if (module == null) throw new ArgumentNullException(nameof(module)); - if (name == null) throw new ArgumentNullException(nameof(name)); + if (instance == null) throw new ArgumentNullException(nameof(instance)); if (Client == null) throw new InvalidOperationException("Service needs to be added to a DiscordClient before modules can be installed."); Type type = typeof(T); + if (name == null) name = type.Name; if (_modules.ContainsKey(type)) throw new InvalidOperationException("This module has already been added."); - var manager = new ModuleManager(Client, module, name, filterType); + var manager = new ModuleManager(Client, instance, name, filter); _modules.Add(type, manager); - module.Install(manager); - return module; + instance.Install(manager); } public ModuleManager Get() where T : class, IModule