Рекомендую на этапе регистрации сервисов, где ты вызываешь foreach - AddScoped/Transient
Регать также синглтон менеджер, в который передай все зареганные типы массивов
var types = Assembly.GetTypes().Where(t => ...).ToArray();
foreach (var type in types)
services.AddScoped(typeof(ICommand), type);
services.AddSingleton<ICommandManager, CommandManager>(provider =>
{
return ActivatorUtilities.CreateInstance<CommandManager>(provider, types);
});
В конструкторе CommandManager можешь получить массив Type[]
Также получи там сервис провайдер. И сможешь уже создавать нужную команду индивидуально
_serviceProvider.GetService(typeof(ICommand), _types[0])...