Structuremap返回开放泛型类型的错误实例?

时间:2016-02-26 13:07:37

标签: c# structuremap open-generics

我正在尝试使用带有开放式泛型的structuremap来在运行时获取事件处理程序的实例,我正在使用基于开放式泛型的配置

     // #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)
            {

            }

        }

我的代码适用于我通过构造函数注入请求depdendency的情况,因为这样可以正常工作。

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)

 }

我收到以下错误。      {&#34;最佳重载方法匹配&#39; MyNameSpace.EventHandlerClass.Handle(MyNameSpace.Events.ThirdEvent)&#39;有一些无效的参数&#34;}

GetAllInstances似乎以某种方式返回EventHandlerClass的对象,并使用Handle方法期待ThirdEvent事件,尽管我使用正确的类型调用了GetAllInstances。

这是一个错误吗?或者我在配置中犯了错误?

1 个答案:

答案 0 :(得分:0)

动态变量只能访问类型方法(通常是public,但基于上下文)。它无权访问明确实现的接口方法。调用显式接口实现的唯一方法是将对象强制转换为接口。

所以你有两个选择,a)按照@Yacoub的建议隐式实现接口,或者b)使用反射来调用方法。

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 });
}