1

実行時にイベントハンドラーのインスタンスを取得するために、オープンジェネリックで構造マップを使用しようとしています。オープンジェネリックベースの構成を使用しています

     // #1 Configuration
         scan.ConnectImplementationsToTypesClosing(typeof(IHandle<>));
// #2 Actual class
      public class EventHandlerClass : 
            IHandle<MyEvent>,
            IHandle<AnotherEvent>,
            IHandle<ThirdEvent>,
        {
             void IHandle<MyEvent>.Handle(MyEvent args)
            {

            }
             void IHandle<AnotherEvent>.Handle(AnotherEvent args)
            {

            }
             void IHandle<ThirdEvent>.Handle(ThirdEvent args)
            {

            }

        }

私のコードは、このようにコンストラクター インジェクションを介して依存関係を要求する場合にうまく機能します。

public MyClass(IHandle<MyEvent>[] alleventHandlers)
{

}

ただし、私の場合、実行時に依存関係をフェッチする必要があります。以下は私が使用しているコードです

 // Code
 Type t = typeof(IHandle<>);
 MyEvent m = new MyEvent();
 var generic = t.MakeGenericType(m.GetType());
 dynamic instances = nestedContainer.GetAllInstances(genType) as IEnumerable;

 foreach( dynamic inst in instances)
 {
     inst.Handle(m)

 }

次のエラーが表示されます。{"'MyNameSpace.EventHandlerClass.Handle(MyNameSpace.Events.ThirdEvent)' に最適なオーバーロードされたメソッドには、無効な引数が含まれています"}

GetAllInstances は、正しい型で GetAllInstances を呼び出したにもかかわらず、ThirdEvent イベントを予期する Handle メソッドで EventHandlerClass のオブジェクトを返すようです。

これはバグですか?または、設定を間違えましたか?

4

1 に答える 1

0

動的変数は型メソッドにのみアクセスできます (通常は public ですが、コンテキストに基づいています)。明示的に実装されているインターフェイス メソッドにはアクセスできません。明示的なインターフェイスの実装を呼び出す唯一の方法は、オブジェクトをインターフェイスにキャストすることです。

したがって、a) @Yacoub によって提案されているようにインターフェイスを暗黙的に実装するか、b) リフレクションを使用してメソッドを呼び出すかの 2 つのオプションがあります。

foreach(dynamic inst in instances)
{
     Type type = inst.GetType();
     Type interfaceType = type.GetInterfaces().Single(t => t == generic);
     interfaceType.GetMethod("Handle").Invoke(inst, new object[] { m });
}
于 2016-02-26T21:01:18.483 に答える