(Для этого я предполагаю вы создали ICommand<T>
)
Это на самом деле не имеет никакого смысла ... подумайте о строке:
//where aString is either myNamedInstance1 or myNamedInstance2
var someType = ObjectFactory.GetNamedInstance(aString);
Теперь предположим, что вы не собираетесь использовать var
, а вместо этого фактический тип. Что бы вы положили туда, что можно скомпилировать? То есть, какой тип может иметь тип someType, отличный от object
?
Кроме того, помните, что ICommand<string>
и ICommand<int>
оба являются построенными типами из ICommand<T>
, но не связаны иначе - у них нет общего базового типа, кроме object
.
Если вы не набираете тип до времени выполнения, обобщения не помогут куче - вместо этого сделайте ваш ICommand<T>
наследуемым от какого-то общего интерфейса - такого как ICommandBase
- с методами, которые вам действительно нужны.
Однако, если вы просто не знаете тип в этом методе , вы можете нажать неизвестное «вверх» в компиляции, сделав метод, содержащий этот универсальный:
public void Execute<T>( string commandName)
{
var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName);
someType.Execute();
}
Теперь вызывающему исполнителю нужен тип param ... но, опять же, вы можете увеличить его. Обратите внимание, что в конечном итоге вам понадобится параметр типа.