-event-只能出现在+ =或 – =的左侧

我在一个循环中有一个事件。 我试图阻止将同一方法多次添加到事件中。 我已经实现了addremove访问器。

但是,我得到一个错误说明:

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,分钟晚了。