在使用事件和委托时,我不确定如何从观察到的类中获取事件的观察者集合。
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();
似乎有点怀疑,看起来有点复杂。
编辑:这会编译并给我答案。我只是有点谨慎,这是一个糟糕的方式来做到这一点。
答案 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();