質問

私は次のことをしなければなりません:

var someType = ObjectFactory.GetNamedInstance("myNamedInstance");

sometypeはicommandの任意の実装になることができます。

だから私はそれらのいくつかを登録しました:

For(typeof(ICommand<>)).Use(typeof(Command1)).Named("myNamedInstance1");
For(typeof(ICommand<>)).Use(typeof(Command2)).Named("myNamedInstance2");

getNamedInstanceには実行時まで知っているタイプパラメーターが必要なため、structuremapでこれを行う方法はありますか?

役に立ちましたか?

解決

(これについては、私は仮定しています 作成した ICommand<T>)

これは実際には意味がありません...行を考えてください:

//where aString is either myNamedInstance1 or myNamedInstance2
var someType = ObjectFactory.GetNamedInstance(aString);

今、あなたが使用しないと仮定します var, 、そして代わりに実際のタイプ。コンパイルできるものは何を置きますか?つまり、どのタイプがいつか他のものである可能性がありますか 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();
}

これで、実行の発信者にはタイプパラメーションが必要です...しかし、繰り返しますが、それをプッシュすることができます。最終的にはタイプパラメーターが必要であることに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top