如何找到在给定对象上扩展基接口的所有接口

本文关键字:接口 扩展 对象 何找 | 更新日期: 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);
   }
}