我必须做以下事情:
var someType = ObjectFactory.GetNamedInstance("myNamedInstance");
其中someType可以是ICommand的任何实现。
所以我注册了其中一些:
For(typeof(ICommand<>)).Use(typeof(Command1)).Named("myNamedInstance1");
For(typeof(ICommand<>)).Use(typeof(Command2)).Named("myNamedInstance2");
有没有办法在StructureMap中执行此操作,因为GetNamedInstance需要我在运行时才知道的type参数。?
答案 0 :(得分:2)
(为此,我假设你创建了ICommand<T>
)
这实际上没有任何意义......想到这一行:
//where aString is either myNamedInstance1 or myNamedInstance2
var someType = ObjectFactory.GetNamedInstance(aString);
现在假设您不打算使用var
,而是使用实际类型。你会在那里编译什么?也就是说,someType可能是哪种类型而不是object
?
另外,请记住ICommand<string>
和ICommand<int>
都是来自ICommand<T>
的构造类型,但不相关 - 它们除了object
之外没有共同的基本类型。< / p>
如果直到运行时才输入类型,泛型不会帮助一堆 - 而是让你的ICommand<T>
继承一些常见的接口 - 比如ICommandBase
- 它有你真正需要的方法
但是,如果您只是不知道该方法中的类型,则可以通过使包含该泛型的方法在编译中推送未知的“up”:
public void Execute<T>( string commandName)
{
var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName);
someType.Execute();
}
现在执行的调用者需要类型参数...但是你可以再次推动它。请注意,最终您将需要type参数。