C# 动态事件订阅和取消订阅



我希望能够让一个对象将其方法之一添加到传递给它的EventHandler中,并使该方法能够将自身从EventHandler中删除。

public class EventRaiser {
public event EventHandler event1
public event EventHandler event2
public void fire() {
event1?.Invoke(this, null);
event2?.Invoke(this, null);
}
}
public class EventSubscriber {
EventHandler eh;
public EventSubscriber(EventHandler eh) {
this.eh = eh;
eh += receive;
}
public void receive(object obj, EventArgs data) {
// Do stuff.
if(condition) eh -= receive;
}
}
public class MainClass {
public void Main() {
EventRaiser er = new EventRaiser();
EventSubscriber es1 = new EventSubscriber(er.event1);
EventSubscriber es2 = new EventSubscriber(er.event2);
er.fire();
}
}

上面的代码无法编译,因为我什至无法将er.event1er.event2传递给EventSubscriber("事件只能出现在 +=...").从EventHandler中删除event关键字可解决此问题,但取消订阅无法正常工作。有没有办法做到这一点?也许使用指针?

这里的问题来自你传递一个EventHandler,而不是它后面的delegate列表本身。基本上是指向处理程序的"方法指针列表"。

如您所见,在event1声明中,您有关键字event,当您将其传递到其他地方时会丢失该关键字。 不幸的是,您无法轻松提取event的"delegate持有人"。

基本上,当您要将处理程序注册到事件时,您需要以某种方式对其进行编译时引用,以便能够+=-=它。

您可以执行以下操作:

public class EventRaiser
{
public delegate void Event1(string args);
public List<Event1> handlers = new List<Event1>();
public void register(Event1 handler)
{
handlers.Add(handler);
}
public void unregister(Event1 handler)
{
handlers.Remove(handler);
}

public void fire()
{
handlers.ForEach(handler => handler("myEventArgs"));
}
}
public class EventSubscriber
{
Action<Event1> registerAction;
Action<Event1> unregisterAction;
public EventSubscriber(Action<Event1> register, Action<Event1> unregister)
{
registerAction = register;
unregisterAction = unregister;
registerAction(receive);
}
public void receive(string args)
{
// Do stuff.
unregisterAction(receive);
}
}
public class MainClass
{
public void Main()
{
EventRaiser er = new EventRaiser();
EventSubscriber es1 = new EventSubscriber(er.register, er.unregister);                
er.fire();
}
}

最新更新