【发布时间】:2015-01-18 23:14:00
【问题描述】:
我有一个 C# 通用接口 interface IMonitor<in T> where T:IEvent
所以 Monitor 应该是通用的 Event 类型
然后我有一个包含监视器集合的类
List<IMonitor<IEvent>> monitors
我正在向它添加IMonitor<IEvent> 的实现。例如。 monitors.Add(new AConcreteMonitor<AConcreteEvent>())
现在,在Trigger(IEvent event) 方法中,我想遍历监视器集合并通知与event 具有相同通用类型的所有监视器。
我有:
void Trigger(IEvent event)
foreach (var monitor in monitors)
{
if (
monitor.GetType()
.GetInterfaces()
.Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == event.GetType()))
{
monitor.Notify(event);
}
}
}
(避免使用 LINQ 以简化调试...)
即使集合中有AConcreteMonitor<AConcreteEvent> 监视器并且触发event 是AConcreteEvent,条件永远不会评估为真。调试时,GetGenericTypeDefinition() 的计算结果为 IMonitor'1。
Q U E S T I O N :
如果在该 foreach 循环中 event 是 AConcreteMonitor<AConcreteEvent>(),我如何获得 interface IMonitor<in T> where T:IEvent 的实际 T,即 AConcreteEvent?
【问题讨论】:
标签: c# generics types interface covariance