事件:从观察中获取事件观察者

时间:2014-02-19 13:24:10

标签: c# events

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

http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx

在此示例中,EventListener的实例订阅了ListWithChangedEvent的实例。使用vanilla观察者模式可以很容易地获得正在侦听ListWithChangedEvent的集合对象(因为它必须维护一组观察者)。但是,使用事件时,如何在观察者对象的ListWithChanged中生成此集合则不太清楚。

是这样的:

Changed.GetInvocationList().Select(item => item.Target).OfType<EventListener>().ToList();

似乎有点怀疑,看起来有点复杂。

编辑:这会编译并给我答案。我只是有点谨慎,这是一个糟糕的方式来做到这一点。

1 个答案:

答案 0 :(得分:1)

你只是在那里,你只需要记住你不能在声明类之外的event标记的代理上使用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();
    }
}

编辑:如果您正在处理第三方课程,那么您无法在课程中使用支持字段或调用GetInvocationList(),那么您可以使用反射:

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();