2013-05-22 9 views
10

でジェネリックメソッドに型を渡す私はこのケースでがMyTypeあるタイプを取得し、GetListのランタイム

ジェネリック型メソッドに渡ししたいと思い、この

Type MyType = Type.GetType(FromSomewhereElse); 

var listS = context.GetList<MyType>().ToList(); 

のようなものを持っていますこれは私が取得していますエラーです:

型または名前空間名「がMyType」が見つかりませんでした(あなたがusingディレクティブまたはアセンブリ参照が不足している?)

+0

あなたはリフレクションを使用する必要があります。 – gdoron

答えて

16

あなたは、リフレクションを使用して、このようなあなたの電話を構築することができます:リフレクションでメソッドを呼び出すと、巨大なパフォーマンスの低下を追加することが、可能であればあなたのソリューションを再設計してみてください

Type MyType = Type.GetType(FromSomewhereElse); 

var typeOfContext = context.GetType(); 

var method = typeOfContext.GetMethod("GetList"); 

var genericMethod = method.MakeGenericMethod(MyType); 

genericMethod.Invoke(context, null); 

注意。あなたは、リフレクションを使用する必要があります

+0

'MakeGenericMethod'が' params'を受け入れるので 'new [] {MyType}'は単純に 'MyType'になります。 – gdoron

+0

ありがとう、私はこれを含めるためのソリューションを変更しました – Alexander

+1

動的メソッドをILEmittingすることによって、パフォーマンスのペナルティを回避することができます。もちろん、ワンショットのペナルティは取ることができますが、それは重い反射の使用の要点です(あなたがその機能にアクセスできる場合)。 –

-1

タイプを使用してジェネリックを動的に構築することはありません。ジェネリックスは、クラスの名前で埋められ、型ではありません。

Activator.CreateInstanceを使用してジェネリック型を作成できます。ジェネリック型は動的に構築する必要があります。

動的にジェネリック型を作成します。

Type listFactoryType = typeof(GenericListFactory<>).MakeGenericType(elementType); 
var dynamicGeneric = (IListFactory)Activator.CreateInstance(listFactoryType); 

リストを汎用メソッドで取得する代わりに、そのメソッドを公開する汎用クラスを作成できます。あなたはそういうインターフェースから派生することができます。

interface IListFactory 
{ 
    IList GetList(); 
} 

class GenericListFactory<T> 
{ 
    public IList GetList() { return new List<T>(); } 
} 
3

var method = context.GetType() 
    .GetMethod("GetList").MakeGenericMethod(MyType) 

IEnumerable result = (IEnumerable)method.Invoke(context, new object[0]); 
List<object> listS = result.Cast<object>().ToList(); 

は、しかし静的な型の変数としてあなたのタイプのインスタンスMyTypeを使用する方法はありませんので、あなたができる最善のはobjectとして結果を入力することです。