Указание аргументов типа - это не время выполнения, оно статически компилируется. Тип должен быть известен во время компиляции. В вашем сценарии он потенциально неизвестен или вычисляется во время выполнения. С помощью отражения можно создать вызов метода, в котором вы указываете аргументы типа, но вряд ли вы захотите это сделать.
Кроме того, большинство контейнеров должно иметь перегрузку, которая будет выглядеть примерно так:
Type ninjaType = typeof(Ninja);
var ninja = (Ninja)ninject.Get(ninjaType);
Наконец, большинство контейнеров должны предоставлять способы указать в конфигурации контейнера, какой тип должен быть предоставлен при определенных условиях. Я знаю, что Ninject имеет симпатичный DSL, чтобы условно указать, какой тип должен возвращаться при каких обстоятельствах. Это будет означать, однако, чтобы кодировать абстракцию и позволить контейнеру решить, что возвращается:
class DependencyConsumer {
ctor(IWarrior warrior) {
//Warrior could be a ninja, because e.g. you told NInject
//that the dependency should be filled that way for this class
}
}