structuremapオープンジェネリック名前付きインスタンス
-
27-09-2019 - |
質問
私は次のことをしなければなりません:
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();
}
これで、実行の発信者にはタイプパラメーションが必要です...しかし、繰り返しますが、それをプッシュすることができます。最終的にはタイプパラメーターが必要であることに注意してください。
所属していません StackOverflow