Подтвердить что ты не робот

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

Ответ 1

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

С более новыми версиями С# это можно упростить:

itemsProcessed?.Invoke(this, EventArgs.Empty);

Ответ 2

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

Ответ 3

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

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

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

Похоже, что это очень длинный путь. Возможно, кто-то еще знает, как лучше решить эту проблему.

Ответ 4

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

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

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