2017-06-14 14 views
2

実行時に定義されたタイプを使用してlistOfBaseItems.Cast<Child>()と同様のものを実現する方法はありますか?例えばキャストIEnumerable <T>ランタイムタイプ

var t = typeof(Child); // the type would be a method argument in my case 
var desiredType = typeof(List<>).MakeGenericType(t); 
var castedList = Convert.ChangeType(listOfBaseItems, desiredType); 

私はアイテムがIConvertibleを実装していないという例外を取得。私は何が欠けていますか?

+0

'Cast'単に汎用の拡張メソッドであり、リフレクションを使用して呼び出すことができます。 –

+0

'List 'を 'List 'にキャストしようとしていますが、*動作できません。 'List 'はクラスなので不変です。あなたはここで達成しようとしていることをよりよく説明する必要があります。 See [ask] –

+0

typeを引数として渡すのではなく、汎用メソッド 'public void Bob ()'を使用していますか?または、型はコンパイル時ではなく、実行時にのみ認識されますか? – mjwills

答えて

1

(例えばlistOfBaseItemsが実際に子項目が含まれている)キャストが合法であると仮定すると、あなたは、このような実行時に(Enumerableクラスのジェネリック拡張メソッドである)Castを呼び出すことができます。

var result = 
    typeof(Enumerable) 
     .GetMethod("Cast") 
     .MakeGenericMethod(t) 
     .Invoke(null, new object[] {listOfBaseItems}); 
+0

ありがとう、これは私が必要なものです! – filur

+0

ようこそ。 –

関連する問題