2016-07-22 15 views
3

たとえば、タイプIList<MyClass>のエンティティを、​​のリストにマップする場合、同じ基になるコレクションタイプを維持します。私が意味する。これによりCで非ジェネリック型にアクセスする

それはObservableCollection<MyMappedClass>List<MyMappedClass>ObservableCollection<MyClass>にマッピングする必要がありList<MyClass>インスタンスはタイプであることを起こる場合。私はこれを行うことができることを知って

Type listType = myList.GetType(); //myList type: List<T> or ObservableCollection<T> 
Type listItemType = listType.GetGenericArguments()[0]; 

Type myListType = typeof(List<>).MakeGenericType(listItemType); 

私はそれを行うことはできません。

を私はこれまでのところ私はこのようなリストのジェネリック型を見つけることができなかった何

Type myListType = myList.GetType().MakeGenericType(listItemType); 

すでに一般的です。私は何を探していますは、次のとおりです。

GotNonGenericType()は私が探しています機能のプレースホルダです
Type myListType = myList.GetType().GotNonGenericType().MakeGenericType(listItemType); 

+1

"魔法の"共分散はインターフェースを超えていますか?うーん。これがパフォーマンス上クリティカルな経路にない限り、私はちょうど 'myList.Cast ().ToList()' – spender

答えて

6

Type.GetGenericTypeDefinition()メソッドを使用してください。タイプの一般的な定義を返します。 List<>からList<Whatever>までである。そして、あなたはType.MakeGenericType(params Type[] typeArguments)方法であなたが望むジェネリック引数を持つ型を作成することができます

var list = new List<int>(); 
var type = myList.GetType();      // ~ typeof(List<int>) 
var generic = type.GetGenericTypeDefinition();   // ~ typeof(List<>) 
var newType = generic.MakeGenericType(typeof(string)); // ~ typeof(List<string>) 

変数newTypeあなたが達成しようとするものが含まれています。

関連する問題