-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;
}
}
Ответы
Ответ 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, и вы должны поднять это частное событие.
Данг, немного позже.