我已经注册了许多实现 IEventListener<T>
的类型界面。
如何解析所有实现 IEventListener<T>
的类型但只使用 Type 变量?
例如,我有事件 SomethingHappened 和两种实现 IEventListener<SomethingHappened>
的类型界面。
我正在通过一些 EventBus 发送事件,并将其作为 Object 类的实例接收。如何仅使用 IEventListener<SomethingHappened>
的结果解析所有监听器(实现 GetType()
接口(interface)的类型)方法?
最佳答案
有几种方法可以做到这一点:
通过接口(interface)解析监听器。
您可以从其通用定义中定义您需要的接口(interface):var eventType = @event.GetType(); // suppose it's SomethingHappened type var eventListenerType = typeof(IEventListener<>).MakeGenericType(eventType); // eventListenerType is IEventListener<SomethingHappened>
然后您可以从任何您想要的地方获得您需要的实现,例如从 lifetimescope。
通过监听的类型注册 EventListener,例如 Keyed 或 Metadate 注册
public static void RegisterMessageHandlers(this ContainerBuilder builder, params Assembly[] assemblies) { foreach (var assembly in assemblies) { var eventListeners = assembly.GetTypes().Where( t => t.IsClass && t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEventListener<>))); foreach (var eventListener in eventListeners) { var interfaces = eventListener.GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEventListener<>)); foreach (var @interface in interfaces) { var eventType = @interface.GetGenericArguments()[0]; builder.RegisterType(eventListener) .As<IEventListener>() .WithMetadata<EventListenerMetadata>(c => c.For(m => m.EventType, eventType)); } } } }
然后你可以注入(inject)所有注册的事件监听器作为
IEnumerable<Lazy<IEventListener, EventListenerMetadata>> eventListeners
并获取你需要的事件监听器
var listOfEventListeners = eventListeners.Where(x => x.Metadata.EventType == eventType);
关于c# - 使用带有 Autofac 的类型变量获取实现通用接口(interface)的所有类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21357229/