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();
}
:
あなたがタイプの新しいインスタンスを作成する必要があることを認識している場合
が、これは1つの可能な方法です。残念ながら、クラスのコンストラクタが空ではないため、例外が発生します。しかし、私は異なるコンストラクタを持つ異なるクラスを持っています。それを動的に解決する方法はありますか? //ここの例 パブリッククラスSomeClass:ISomeClass、ISearchThisInterface { protected readonly IBeAnotherInterface _anotherService; public SomeClass( IBeAnotherInterface anotherService) { _anotherService = anotherService); } \t //両方のインターフェイスにいくつかのメソッドがあります } – TudoroIoCコンテナを使用して型を動的に解決することは可能です。上記よりも重い解決策になるので、Googleに試すことができます(例:http://stackoverflow.com/questions/820520/ioc-how-to-create-objects-dynamically)。 'Activator'に基づく解決策は、無パラメータのコンストラクタに対してのみ機能します。 –
IoCコンテナを使用してこのソリューションを新しいレベルに引き上げたい場合は、新しい質問を開き、パラメータのないコンストラクタで使用できる最終コードを開始点として投稿することをお勧めします。誰かがそれを手伝ってくれるかもしれません。 –