-event- может появляться только в левой части + = или - = - PullRequest
28 голосов
/ 21 декабря 2010

У меня есть событие в цикле.Я пытаюсь предотвратить добавление одного и того же метода к событию более одного раза.Я реализовал add и remove методы доступа.

Тем не менее, я получаю сообщение об ошибке:даже в пределах одного класса.

ItemsProcessed(this, new EventArgs()); // Produces error

public event EventHandler ItemsProcessed
{
    add
    {
        ItemsProcessed -= value;
        ItemsProcessed += value;
    }
    remove
    {
        ItemsProcessed -= value;
    }
}

Ответы [ 4 ]

29 голосов
/ 21 декабря 2010

При явном событии вам нужно предоставить собственное хранилище резервных копий - либо поле делегата, либо что-то вроде 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);
9 голосов
/ 11 октября 2012

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

7 голосов
/ 27 июля 2015

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

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

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

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

2 голосов
/ 21 декабря 2010

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

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

Данг, с опозданием на минуту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...