我有一个C#通用接口interface IMonitor<in T> where T:IEvent
因此,监视器应该是通用的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循环中的T
为interface IMonitor<in T> where T:IEvent
,如何获得AConcreteEvent
的实际event
,即AConcreteMonitor<AConcreteEvent>()
?
答案 0 :(得分:0)
现在我输入了这个问题,而且#yahoogled&#39;在此过程中的一些事情,我发现我可以使用通用方法,然后只查询typeof(T)
void Trigger<T>(IEvent event) where T:IMonitor<IEvent>
foreach (var monitor in monitors.Where(m=> m.GetType() == typeof(T)))
{
monitor.Notify(event);
}
简单!
以防万一有类似问题...