Вопрос: -event- может появляться только с левой стороны + = или - =


У меня есть событие в цикле. Я пытаюсь предотвратить добавление одного и того же метода в событие более одного раза. Я реализовал 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;
    }
}

21


источник


Ответы:


При явном событии вам необходимо предоставить свой собственный резервный магазин - поле делегата или что-то вроде 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);

21



Кажется, что если вы реализуете EventHandler явно, вы не можете ссылаться на «Свойство» при запуске события. Вы должны обратиться в хранилище.


7



Я не могу сказать из вашего сообщения, если вы пытаетесь поднять событие из производного класса или нет, но я обнаружил, что вы не можете определить событие в базовом классе, а затем поднять его (напрямую) в производном классе, по какой-то причине это пока не совсем ясно.

Поэтому я определяю защищенные функции в базовых классах для повышения событий (которые определены в этих базовых классах), например:

// 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 (название, итого) вместо вызова ProgressStarted (название, итоговое).

Это похоже на долгий путь. Может быть, кто-то еще знает, как лучше справиться с этой проблемой.


5



Какая ошибка? Я думаю, его ошибка переполнения стека, потому что вы вызываете add и remove на yourserlf (одно и то же событие). Также вы не можете поднять событие ACCESSOR.

Допустимый способ сделать это - создать резервное закрытое событие, которое будет добавлено и удалено из открытого доступа, и вы должны поднять это частное событие.

Данг, немного поздно.


1