C # Class Измененное событие, приводящее к тому, что ссылка на объект не установлена ​​на экземпляр объекта - PullRequest
4 голосов
/ 02 июня 2011

Мне нужно событие, чтобы срабатывать при изменении свойства.Когда я запускаю этот код, я получаю ссылку на объект, не установленную для экземпляра объекта.Что я делаю неправильно?Как правильно создать экземпляр события и запустить его, когда установлено свойство?

открытый член:

public event System.EventHandler ClassChanged;

набор свойств:

ClassChanged(this, EventArgs.Empty);

Ответы [ 5 ]

6 голосов
/ 02 июня 2011

Вам нужно сначала проверить, что обработчик событий не равен нулю:

if (ClassChanged != null)
    ClassChanged(this, EventArgs.Empty);

Но в общем случае вы можете захотеть обернуть это во вспомогательный метод, например так:

private void NotifyClassChanged() {
    if (ClassChanged != null)
        ClassChanged(this, EventArgs.Empty);
}

Или, возможно, вместо этого реализуйте INotifyPropertyChanged .

3 голосов
/ 02 июня 2011

Попробуйте это:

System.EventHandler handler = this.ClassChanged;
if (handler != null)
{
    handler(this, EventArgs.Empty);
}
2 голосов
/ 02 июня 2011

Это происходит потому, что на событие не было подписано ни одного обработчика событий.

Правильный способ убедиться, что многоадресный делегат события не является null потокобезопасным:

var cc = ClassChanged; //makes a copy
if (cc != null)
    cc(this, EventArgs.Empty);

Однако метод, который я предпочитаю, - объявить событие с пустым лямбда-обработчиком, чтобы оно никогда не было null:

public event EventHandler ClassChanged = (o,e) => {};
1 голос
/ 25 июня 2014

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

. Поэтому, если у вас есть

public event System.EventHandler ClassChanged;    

ClassChanged(this, EventArgs.Empty);

, вы создаетеследующий метод

private void OnClassChanged()
{
   if (ClassChanged != null)
   {
       ClassChanged(this, EventArgs.Empty);
   }
}

и вызов OnClassChanged (...), а не событие ClassChanged (...)

0 голосов
/ 02 июня 2011

Возможно, к ClassChanged не подключен обработчик событий.(Невозможно увидеть остальную часть кода) Поэтому сначала проверьте, не является ли ClassChanged нулевым, прежде чем запускать его.

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