2017-09-06 4 views
-1

私はすべてが単純なインターフェイスを実装する多くの種類があります。一般的な引数として型のリストを使用するにはどうすればよいですか?

私はタイプのリストを取得し、その後、私は「ドン

DoThing.Doit<TypeA>(); 
DoThing.Doit<TypeB>(); 
DoThing.Doit<TypeC>(); 
+1

そうすることであなたの問題は何ですか?何を試しましたか? https://stackoverflow.com/questions/4738280/use-reflection-to-call-generic-method-on-object-instance-with-signature-someobjをご覧ください。これらのタイプはすべて同じアセンブリ内にありますか?すべての実装タイプをどのように取得しますか?あなたの質問ははるかに広いです。 – HimBromBeere

答えて

1

のリストを維持するために、一般的な方法でそれらを使用

ForEach(var type in TypesThatImplement<Ifoo>){ 
    DoThing.Doit<type>();  
} 

よりもむしろ持ってできるようにしたいと思います実際にあなたがこれをやっている実用的な理由を実際に見ています(もっと大きな問題のほんの一部かもしれませんが)、それは可能です(下記参照)。より具体的な問題がある場合は、質問を更新してみてください。

 DoThing doThing = new DoThing(); 

     //loop through types which are IFoo 
     foreach (var type in AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).Where(p => typeof(IFoo).IsAssignableFrom(p) && p.IsClass)) 
     { 
      //call DoThing.Doit<t> method using reflection 
      MethodInfo method = typeof(DoThing).GetMethod("Doit"); 
      MethodInfo generic = method.MakeGenericMethod(type); 
      generic.Invoke(doThing, null); 
     } 

注、上記のコードは定義されているようDoThingを前提としています

public class DoThing 
{ 
    public void Doit<T>() where T : IFoo 
    { 
    } 
} 
+0

ありがとうございます。 「完了」を必要とするタイプのリストは長く、長くなります。作成時にリストに追加することを忘れていなければ、それは私のためには良いことです。 – Loofer

関連する問題