我有一个接口,用于定义一些实现的事件
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();
}
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
这是您基本上需要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句