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

时间:2010-12-21 06:31:59

标签: c# event-handling

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

但是,我收到错误声明:

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;
    }
}

4 个答案:

答案 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,迟到了。