-event-只能出现在+ =或 – =的左侧
我在一个循环中有一个事件。 我试图阻止将同一方法多次添加到事件中。 我已经实现了add
和remove
访问器。
但是,我得到一个错误说明:
ItemsProcessed can only appear on the left hand side of += or -=
当我试着打电话给他们时,即使是在同一个class级里。
ItemsProcessed(this, new EventArgs()); // Produces error public event EventHandler ItemsProcessed { add { ItemsProcessed -= value; ItemsProcessed += value; } remove { ItemsProcessed -= value; } }
使用显式事件,您需要提供自己的后备存储 – 委托字段或类似EventHandlerList
。 当前代码是递归的。 尝试:
private EventHandler itemsProcessed; public event EventHandler ItemsProcessed { add { itemsProcessed-= value; itemsProcessed+= value; } remove { itemsProcessed-= value; } }
然后(并注意到我对“即将转为null
”边缘案例重新线程有点谨慎):
var snapshot = itemsProcessed; if(snapshot != null) snapshot(this, EventArgs.Empty);
使用更新的C#版本,可以简化:
itemsProcessed?.Invoke(this, EventArgs.Empty);
看起来如果你明确地实现了EventHandler
,那么在触发事件时你就不能引用’Property’。 您必须参考后备存储。
我无法从你的post中判断你是否试图从派生类中提取事件,但我发现有一件事是你不能在基类中定义事件然后直接提升它(直接)在派生类中,由于某种原因,我还不清楚。
所以我在基类中定义受保护的函数来引发事件(在那些基类中定义),如下所示:
// The signature for a handler of the ProgressStarted event. // title: The title/label for a progress dialog/bar. // total: The max progress value. public delegate void ProgressStartedType(string title, int total); // Raised when progress on a potentially long running process is started. public event ProgressStartedType ProgressStarted; // Used from derived classes to raise ProgressStarted. protected void RaiseProgressStarted(string title, int total) { if (ProgressStarted != null) ProgressStarted(title, total); }
然后在派生类中,我调用RaiseProgressStarted(title,total)而不是调用ProgressStarted(title,total)。
这似乎有点长远。 也许别人知道解决这个问题的更好方法。
什么错误? 我猜它的堆栈溢出错误,因为你在yourserlf上调用add和remove(同一事件)。 你也不能举起活动ACCESSOR。
执行此操作的有效方法是创建后备私有事件,该事件将添加到公共访问器并从公共访问器中删除,您应该引发此私有事件。
Dang,分钟晚了。