查询实现通用接口的类的泛型类型定义

时间:2014-11-20 22:18:00

标签: c# generics types interface covariance

我有一个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 U E S T I O N:

如果该foreach循环中的Tinterface IMonitor<in T> where T:IEvent,如何获得AConcreteEvent的实际event,即AConcreteMonitor<AConcreteEvent>()

1 个答案:

答案 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);
}

简单!

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