private void RegisterCommands() { var assembly = Assembly.GetExecutingAssembly(); var assemblyTypes = assembly.GetTypes(); var registerCommandsMethod = _commands.GetType().GetMethods().FirstOrDefault(p => p.Name == "RegisterCommands" && p.IsGenericMethod); foreach (var type in assemblyTypes) { var attributes = type.GetCustomAttributes(); if (attributes.Any(p => p.GetType() == typeof(CommandsGroupAttribute))) { var genericRegisterCommandMethod = registerCommandsMethod?.MakeGenericMethod(type); genericRegisterCommandMethod?.Invoke(_commands, null); if (genericRegisterCommandMethod == null) { _logger.Fatal($"Can't register {type.Name}"); return; } _logger.Info($"{type.Name} registered"); } } }