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

本文关键字:泛型类型参数 实现 Type 查找 使用 泛型类 | 更新日期: 2023-09-27 17:55:01

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

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> {...}

我试图通过反射来弄清楚什么事件处理程序使用某个类型为"X"的具体事件作为泛型类型参数来实现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();
}

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

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是您基本上需要的。