2016-10-06 3 views
1

型とジェネリック型が変数として定義されている新しいオブジェクトをインスタンス化したいと思います。最終的な結果は、手動で、ここで作成したnewListOfObjectsのようになります。変数のみを使用して、新しいオブジェクトをインスタンス化しようとしたとき変数からジェネリック型をインスタンス化する

public class TabViewModel 
{ 
    public string Title { get; set; } 
    public int TabOrder { get; set; } 
} 

問題が来る:TabViewModelは、次のオブジェクトである

var newListOfObjects = new List<TabViewModel>(); 

。 1つのジェネリック型の変数genericTypeがあります。これは、インタフェースであり、型引数listOfTypeArgsのリストです。上記の例では、ジェネリック型はIListで、引数はTabViewModelです。その後、(、いくつかのコードが理解しやすくするためのpsudoあるノート)を次のようになります。

Type genericType = IList'1; 
Type[] listOfTypeArgs = TabViewModel; 
var newObject = Activator.CreateInstance(genericType.MakeGenericType(listOfTypeArgs)); 

私が私がインスタンス化することはできませんとエラー「System.MissingMethodException」を取得すること、その後明らかですインタフェースからの変数。

新しいオブジェクトをインスタンス化できるように、インターフェイスをそのrepresenativeに変換するにはどうすればよいですか?

注:タイプgenericType = IList'1を変更することはできません。また タイプ[] listOfTypeArgs = TabViewModel;

+2

このGenerativeType = IList'1;およびこのType [] listOfTypeArgs = TabViewModel;は有効なC#構文ではありません。実際のコードを投稿してください! – user3185569

+0

この場合IListとTabViewModelの型を取得するための有効なコードは無関係です。 –

+0

user3185569のリクエストを無視する場合は、再度送信する前にhttp://stackoverflow.com/help/mcveを読んでください。 – Aziuth

答えて

0

エラーが自己記述的である、あなたがインスタンスを作成するための具体的な種類を必要としています。代わりのIList(何の実装を持っていないし、ちょうど契約されている)、あなたはIListの実装を使用する必要があります。

Type genericType = typeof(List<>); 
Type[] listOfTypeArgs = new[] { typeof(TabViewModel) }; 
var newObject = Activator.CreateInstance(genericType.MakeGenericType(listOfTypeArgs)); 

編集:

あなたは具体的なタイプを持っていない場合は、コンテナを使用するか、現在のアセンブリを反映させる必要があります。以下は、あなたがあなたの場合に役立つ方法を微調整する必要がある、ちょっとしたハックです。

Type genericType = typeof(List<>); 
Type concreteType = AppDomain.CurrentDomain.GetAssemblies() 
          .SelectMany(s => s.GetTypes()) 
          .Where(p => genericType.IsAssignableFrom(p)).FirstOrDefault(); 

Type[] listOfTypeArgs = new[] { typeof(TabViewModel) }; 
var newObject = Activator.CreateInstance(concreteType.MakeGenericType(listOfTypeArgs)); 
+0

素敵な回答ですが、残念ながら私はgenericType変数を変更できません。私はちょうどインターフェイスを取得し、それは私の問題です –

+0

@ViktorLeanderssonその後、そのインターフェイスの実装を見つけるためにリフレクションを使用する必要があります。編集された回答を確認する – user3185569

0

あなたがそうのようなList<>タイプを使用する必要があります。

var genericType = typeof(List<>); 
var boundType = genericType.MakeGenericType(typeof(TabViewModel)); 
var instance = Activator.CreateInstance(boundType); 
+0

素敵ですが、残念ながら私はgenericType変数を変更できません。私はちょうどインターフェイスを取得し、私の問題です –

+0

@ViktorLeanderssonその後、可能なすべてのインターフェイスを具体的な実装にマップするマップを作成することができます。 'IList <>'は 'List <>'にマップされます – Nico