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

C# 使用类型';查找实现泛型类的类;x';作为泛型类型参数,c#,generics,reflection,C#,Generics,Reflection,我有一个用一些实现定义事件的接口 public interface IEvent {...} public sealed class OrderPersisted : IEvent {...} 以及一个接口,用于通过抽象泛型中间类实现处理这些事件: public interface IEventHandler {...} public abstract class EventHandlerBase<TEvent> : IEventHandler where TEvent : IEv

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

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> {...}
提前谢谢

编辑 以下几点对我有用

foreach(var eventType in myAssembliesConcreteEventTypes)
{
    myEventTypesDictionary[eventType] = exportedTypesOfMyAssembly
        .Where(t => t.BaseType.GenericTypeArguments.Any(gta => gta == type))
        .Select(t=>(IEventHandler)Activator.CreateInstance(t))
        .ToList();
}
var opType=typeof(OrderPersisted)//你的选择
var myType=typeof(EventHandlerBase);
var myExpectedTypes=Assembly.getExecutionGassembly()
.GetTypes()
.其中(x=>x.IsSubclassOf(myType))
.ToArray();

通过
Assembly.getExecutionGassembly()
可以用感兴趣的程序集替换它
IsubClassof
是您基本需要的。

事件类型是动态的,我不能只使用
typeof(EventHandlerBase)
,我的程序集中还有其他事件。正如您所注意到的,我正在对动态获取的
myAssembliesConcreteEventTypes
进行迭代。现在这是有意义的,但我仍然不太习惯于
MakeGenericType
调用。这并不难
typeof(EventHandlerBase)
将返回
EventHandlerBase
我们只是要求运行时heyy使用type参数为我创建一个具体的类型
orderspersisted
这有意义吗?我是说性能方面,为什么我要创建一个我已经拥有的类型,并且我可以在查询中选择它?没有,我相信您并没有创建新的类型实例。运行时将返回相同的引用。您可以通过以下代码测试这一点:
var opType=typeof(orderspersisted);var myType=typeof(EventHandlerBase);var myType2=typeof(EventHandlerBase);bool sameReference=object.ReferenceEquals(myType,myType2)
foreach(var eventType in myAssembliesConcreteEventTypes)
{
    myEventTypesDictionary[eventType] = exportedTypesOfMyAssembly
        .Where(t => t.BaseType.GenericTypeArguments.Any(gta => gta == type))
        .Select(t=>(IEventHandler)Activator.CreateInstance(t))
        .ToList();
}
var opType = typeof(OrderPersisted);//Your choice
var myType = typeof (EventHandlerBase<>).MakeGenericType(opType);
var myExpectedTypes = Assembly.GetExecutingAssembly()
    .GetTypes()
    .Where(x => x.IsSubclassOf(myType))
    .ToArray();