我有以下场景
public interface IEvent {}
public interface IEventHandler<T> where T : IEvent {
void Handle(T evt);
}
public class ItemCreatedEvent : IEvent {}
public class ItemCreatedEventHandler : IEventHandler<ItemCreatedEvent> {
void Handle(ItemCreatedEvent evt) { ... }
}
以下所有内容都可以:
当我想在此实例上调用 .Handle() 方法时,问题就出现了
...
var handler = (IEventHandler)Activator.CreateInstance(handlerType);
handler?.Handle(evt);
这给我带来了以下问题:
(IEventHandler)
,Handle()
方法是未知的(IEventHandler<IEvent>)
,它会失败,因为“无法从 ItemCreatedEventHandler
隐式转换为 IEventHandler<IEvent>
”从我到目前为止发现的情况来看,这与类型不变性有关,但我没有找到任何可以帮助我解决问题的东西。
谢谢!
如果我转换为
,它会失败,因为“无法从(IEventHandler<IEvent>)
隐式转换为ItemCreatedEventHandler
”IEventHandler<IEvent>
那是因为对于
IEventHandler<T>
,T
是不变的,所以 IEventHandler<ItemCreatedEvent>
不是 IEventHandler<IEvent>
。
在您的示例中,不可能使
T
协变,因为 T
用于接口定义中的输入位置,因此这样做不是类型安全的:
void Handle(T evt);
一旦你在这里开始反思,你就需要继续反思:
var handler = Activator.CreateInstance(handlerType);
var method = handler.GetMethod("Handle");
method.Invoke(handler, new object[] { evt });