我在循环中有一个事件。我试图阻止将同一方法多次添加到事件中。我已经实现了add
和remove
访问者。
但是,我收到错误声明:
ItemsProcessed can only appear on the left hand side of += or -=
当我试图打电话给他们时,即使是在同一个班级。
ItemsProcessed(this, new EventArgs()); // Produces error
public event EventHandler ItemsProcessed
{
add
{
ItemsProcessed -= value;
ItemsProcessed += value;
}
remove
{
ItemsProcessed -= value;
}
}
答案 0 :(得分:28)
使用显式事件,您需要提供自己的后备存储 - 代理字段或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);
答案 1 :(得分:8)
如果您明确实施EventHandler
,您似乎无法参考'属性'在解雇事件时。您必须参考后备存储。
答案 2 :(得分:5)
我不能从你的帖子中说出你是否试图从衍生课程中提出这个事件,但我发现的一件事是你无法在一个事件中定义一个事件。基类然后在派生类中直接提升它(由于某些原因,我还没有真正清楚)。
所以我在基类中定义受保护的函数来引发事件(在那些基类中定义),如下所示:
// 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)。
看起来好像还有很长的路要走。也许其他人知道解决这个问题的更好方法。
答案 3 :(得分:1)
什么错误?我猜它的堆栈溢出错误,因为你在yourserlf上调用add和remove(同一事件)。你也不能举起活动ACCESSOR。
执行此操作的有效方法是创建后备私有事件,该事件将被添加到公共访问者并从公共访问者中删除,您应该引发此私有事件。
Dang,迟到了。