(このために、私はあなたが作成したと仮定しています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 パラメータが必要になることに注意してください。