1

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

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 でこれを行う方法はありますか?

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();
}

execute の呼び出し元には type param が必要ですが、それを押し上げることができます。最終的には type パラメータが必要になることに注意してください。

于 2010-11-23T15:54:22.760 に答える