2017-01-14 11 views

答えて

2

// getting the list 
List<Type> instances = 
    Assembly.GetExecutingAssembly() 
     .GetTypes() 
     .Where(a => a.GetInterfaces().Contains(typeof(ISearchThisInterface))).ToList(); 

foreach (Type instance in instances) 
{ 
    // here I want to execute the method of the classes that implement the interface 
    (instance as ISearchThisInterface).GetMyMethod(); 
} 

多くのおかげであなたがここにしなければならない二つのことがあります。

  • は、インターフェイスを実装タイプ、およびそれらの型
  • インスタンス化オブジェクトを探します

    両方が実行された後でのみ、インスタンスに対してメソッドを呼び出すことができます。

    重要な点は、選択されたすべてのタイプでインスタンス化が可能でなければならないことです。非抽象型、非ジェネリック型、およびパラメータなしコンストラクタでなければなりません。そうでなければインスタンス化する方法がありません。見栄え

    IEnumerable<ISearchThisInterface> instances = 
        Assembly.GetExecutingAssembly() 
         .GetTypes() // Gets all types 
         .Where(type => typeof(ISearchThisInterface).IsAssignableFrom(type)) // Ensures that object can be cast to interface 
         .Where(type => 
          !type.IsAbstract && 
          !type.IsGenericType && 
          type.GetConstructor(new Type[0]) != null) // Ensures that type can be instantiated 
         .Select(type => (ISearchThisInterface)Activator.CreateInstance(type)) // Create instances 
         .ToList(); 
    
    foreach (ISearchThisInterface instance in instances) 
    { 
        instance.AMethod(); 
    } 
    
  • +0

    あなたがタイプの新しいインスタンスを作成する必要があることを認識している場合

    が、これは1つの可能な方法です。残念ながら、クラスのコンストラクタが空ではないため、例外が発生します。しかし、私は異なるコンストラクタを持つ異なるクラスを持っています。それを動的に解決する方法はありますか? //ここの例 パブリッククラスSomeClass:ISomeClass、ISearchThisInterface { protected readonly IBeAnotherInterface _anotherService; public SomeClass( IBeAnotherInterface anotherService) { _anotherService = anotherService); } \t //両方のインターフェイスにいくつかのメソッドがあります } – Tudoro

    +0

    IoCコンテナを使用して型を動的に解決することは可能です。上記よりも重い解決策になるので、Googleに試すことができます(例:http://stackoverflow.com/questions/820520/ioc-how-to-create-objects-dynamically)。 'Activator'に基づく解決策は、無パラメータのコンストラクタに対してのみ機能します。 –

    +0

    IoCコンテナを使用してこのソリューションを新しいレベルに引き上げたい場合は、新しい質問を開き、パラメータのないコンストラクタで使用できる最終コードを開始点として投稿することをお勧めします。誰かがそれを手伝ってくれるかもしれません。 –

    関連する問題