使用Type' x'查找实现泛型类的类。作为泛型类型参数

时间:2014-03-29 13:04:22

标签: c# generics reflection

我有一个用于定义具有某些实现的事件的接口

public interface IEvent {...}
public sealed class OrderPersisted : IEvent {...}

以及通过抽象通用中间类实现处理这些事件的接口:

public interface IEventHandler {...}
public abstract class EventHandlerBase<TEvent> : IEventHandler where TEvent : IEvent {...}
//The following event handler uses the OrderPersisted event as the generic type argument.
public sealed class OrderPersistedEventHandler : EventHandlerBase<OrderPersisted> {...}

我想要实现的目标是使用反射来确定哪些事件处理程序使用某种类型的具体事件&#39; X&#39;作为实现EventHandlerBase<>类的泛型类型参数。可能会出现以下情况:

foreach(var eventType in myAssembliesConcreteEventTypes)
{
    myEventTypesDictionary[eventType] = 
    exportedTypesOfMyAssembly.Where(/*-- implements EventBase with eventType --*/)
}

提前致谢。

修改

以下为我工作

foreach(var eventType in myAssembliesConcreteEventTypes)
{
    myEventTypesDictionary[eventType] = exportedTypesOfMyAssembly
        .Where(t => t.BaseType.GenericTypeArguments.Any(gta => gta == type))
        .Select(t=>(IEventHandler)Activator.CreateInstance(t))
        .ToList();
}

1 个答案:

答案 0 :(得分:2)

var opType = typeof(OrderPersisted);//Your choice
var myType = typeof (EventHandlerBase<>).MakeGenericType(opType);
var myExpectedTypes = Assembly.GetExecutingAssembly()
    .GetTypes()
    .Where(x => x.IsSubclassOf(myType))
    .ToArray();

我通过Assembly.GetExecutingAssembly()反映出你可以用你感兴趣的集会代​​替它。 IsSubclassOf是您基本需要的。

相关问题