结构图为开放泛型类型返回错误的实例?
Structuremap returning wrong instance for open generic type?
我正在尝试使用带有开放式通用的结构图在 运行 时获取事件处理程序的实例,我正在使用基于开放式通用的配置
// #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)
}
我收到以下错误。
{"The best overloaded method match for 'MyNameSpace.EventHandlerClass.Handle(MyNameSpace.Events.ThirdEvent)' has some invalid arguments"}
GetAllInstances 似乎 return 一个 EventHandlerClass 的对象,它的 Handle 方法期待 ThirdEvent 事件,尽管我用正确的类型调用了 GetAllInstances。
这是一个错误吗?还是我配置有误?
动态变量只能访问类型方法(通常 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 });
}
我正在尝试使用带有开放式通用的结构图在 运行 时获取事件处理程序的实例,我正在使用基于开放式通用的配置
// #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)
}
我收到以下错误。 {"The best overloaded method match for 'MyNameSpace.EventHandlerClass.Handle(MyNameSpace.Events.ThirdEvent)' has some invalid arguments"}
GetAllInstances 似乎 return 一个 EventHandlerClass 的对象,它的 Handle 方法期待 ThirdEvent 事件,尽管我用正确的类型调用了 GetAllInstances。
这是一个错误吗?还是我配置有误?
动态变量只能访问类型方法(通常 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 });
}