如何找到在给定对象上扩展基接口的所有接口
本文关键字:接口 扩展 对象 何找 | 更新日期: 2023-09-27 18:15:16
我正在尝试创建一个粗糙/基本的事件订阅/发布系统,只是为了实验。
我创建了一个基本的IEventListener
接口,然后在此基础上创建了一个通用的IEventListener<T> : IEventListener
接口,该接口具有OnEvent(T eventParam)
功能
然后我创建了一个测试类来实现IEventListener<string>
和IEventListener<int>
我认为通过以下方式传递它:
Dictionary<Type, List<object>> _listenersByType = new Dictionary<Type, List<object>>();
foreach(Type interfaceType in listener.GetType().GetInterfaces())
{
if(interfaceType is IEventListener)
{
AddSubscriber(interfaceType.GetGenericTypeDefinition(), listener);
}
}
我可以创建一个事件类型到对象的查找,以强制转换和发布事件。然而,当一步步走过。我看到它循环了所有的接口,我可以看到类型名称是"IEventListener",但条件从来没有为真,也从来没有将我的监听器添加到字典中。
粘贴完整代码
通过我不确定的方法(我在调试器中摸索了一下),这修复了它:
foreach(Type interfaceType in listener.GetType().GetInterfaces())
{
if(interfaceType.GetInterfaces().Contains(typeof(IEventListener)))
{
AddSubscriber(interfaceType.GetGenericArguments()[0], listener);
}
}
但是我不能告诉你为什么我要检查接口。或者为什么我必须调用interfaceType.GetGenericArguments()[0]
而不是interfaceType.GetGenericTypeDefinition()
。
我觉得这段代码很糟糕,我在这里遇到了设计问题。我从没想过解决方案会如此……丑。
您可以直接询问对象本身是否实现了接口。例如,我创建了一个伪类:
public class SListener<T> : IEventListener<T>
{
public void OnEvent(T eventParam)
{
}
}
及其对象
var s = new SListener<string>();
如果我问
bool t = (s is IEventListener);
这是真的。
订阅方法可以是
public void Subscribe(object listener)
{
if(listener is IEventListener)
{
AddSubscriber(interfaceType.GetGenericTypeDefinition(), listener);
}
}