C# 事件:从观察到的事件获取事件观察者

C# 事件:从观察到的事件获取事件观察者,c#,events,C#,Events,在使用事件和委托时,我不确定如何从观察到的类中获取事件的观察者集合 在本例中,EventListener的实例被订阅到ListWithChangedEvent的实例。使用vanilla observer模式,很容易获得正在侦听ListWithChangedEvent的集合对象(因为它必须维护一个观察者集合)。然而,使用事件,如何在观察者对象列表中生成此集合就不太清楚了 是不是有点像: Changed.GetInvocationList().Select(item => item.Targ

在使用事件和委托时,我不确定如何从观察到的类中获取事件的观察者集合

在本例中,EventListener的实例被订阅到ListWithChangedEvent的实例。使用vanilla observer模式,很容易获得正在侦听ListWithChangedEvent的集合对象(因为它必须维护一个观察者集合)。然而,使用事件,如何在观察者对象列表中生成此集合就不太清楚了

是不是有点像:

Changed.GetInvocationList().Select(item => item.Target).OfType<EventListener>().ToList();
Changed.GetInvocationList().Select(item=>item.Target).OfType().ToList();
似乎有点可疑,似乎有点复杂


编辑:这将编译并给出我的答案。我只是有点担心这样做不好

您就快到了,您只需要记住,不能在声明类外部对标记为
事件的委托使用GetInvocationList(),因此您需要声明一个支持字段或在类内部进行调用

class EventListener
{
    public EventPublisher publisher = new EventPublisher();

    public EventListener()
    {
        publisher.Event += HandleEvent;
    }

    void HandleEvent(object sender, EventArgs e)
    {
    }
}

class EventPublisher
{
    public event EventHandler Event;

    public List<EventListener> GetListeners()
    {
        return Event.GetInvocationList().Select(i => i.Target).OfType<EventListener>().ToList();
    }
}

它编译了吗?它起作用了吗?你能打破它吗?你是想在负责这个事件的对象中打破它吗?你想用这个达到什么目的?您希望静态方法发生什么?您还应该记住,执行订阅的代码可能不是包含处理事件的方法的代码…@Gusdor Yes。它确实编译了,对不起,我以为不会。不过,我仍然对此表示怀疑,我感到惊讶的是,仅仅获取听力课堂实例的列表会有这么多麻烦。@JonSkeet很公平,谢谢你,我没有考虑这些事情。我要重新思考我为什么想要这个系列。我还是想知道我是否回答了我自己的问题。谢谢。但是,您知道您声明事件的显式方式与标准实现有何不同吗?您可以在声明类似于字段的事件的类中找到委托本身。(我只是仔细检查了一下以确定。)还要注意,您的事件实现不是线程安全的,这与类字段事件的实现不同。
var fieldInfo = typeof(EventPublisher).GetField("Event", BindingFlags.Instance | BindingFlags.NonPublic);
var eventHandler = (EventHandler)fieldInfo.GetValue(listener.publisher);
var listeners = eventHandler.GetInvocationList().Select(i => i.Target).ToList();