1

我必须执行以下操作:

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 需要我直到运行时才知道的类型参数。?

4

1 回答 1

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

如果您在运行时之前不输入类型,那么泛型不会有帮助 - 而是让您ICommand<T>从一些公共接口继承 - 例如ICommandBase- 具有您实际需要的方法。

但是,如果您只是不知道该方法中的类型,则可以通过使包含该泛型的方法在编译中推动未知的“向上”:

public void Execute<T>( string commandName)
{        
    var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName);
    someType.Execute();
}

现在执行的调用者需要类型参数......但你可以再次推动它。请注意,最终您将需要类型参数。

于 2010-11-23T15:54:22.760 回答