2014-11-20 100 views
0

我有一个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>显示器集合中,并触发eventAConcreteEvent。调试时,GetGenericTypeDefinition()评估为IMonitor'1

Qü(E S)T I O 4 N:

我如何获得的interface IMonitor<in T> where T:IEvent实际T,即AConcreteEvent如果event是在foreach循环AConcreteMonitor<AConcreteEvent>()

回答

0

现在,我输入的问题,“yahoogled”有些东西,一路上,我发现,我在用一个通用的方法的位置,然后就查询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); 
} 

简单!

以防万一有人有类似的问题...