Подписка на событие потеряна при передаче объекта экземпляра - PullRequest
2 голосов
/ 27 июля 2011

Я создал внешний класс (TheClass) с событием (TheEvent) и подписался на него из конструктора Panel другого класса:

public aPanel()
{
   ...
   theClassInstance.TheEvent += new WaitCallback(aMethod);
   ...
}

Позже в программе я вызываюметод, передавая theClassInstance в качестве единственного параметра

bMethod((object)theClassInstance);

, где

public void bMethod(object inputTheClassInstance)
{
   ...
}

Зная, что входной объект имеет тип TheClass, я делаю следующее:

public void bMethod(object inputTheClassInstace)
{
   TheClass theClassInput = (TheClass)inputTheClassInstace;
   ...
}

Позже в bMethod() я вызываю метод RaiseEvent(), предоставляемый theClassInput, который фактически вызывает событие.В RaiseEvent() у меня есть

if(this.TheEvent != null)
   TheEvent();

, чтобы убедиться, что что-то подписано на событие, но this.TheEvent равно нулю.Если я размещу подписку в пределах bMethod()

bMethod(...)
{
   ...
   theClassInput.TheEvent += new WaitCallback(aMethod);  
   ...
}

, она будет работать нормально, но я бы хотел оставить ее в конструкторе Panel.Я подумал, что, поскольку theClassInput указывает на тот же объект, что и theClassInstance, это не будет иметь значения, которое вызывает событие.Любые мысли о том, как сохранить подписку в конструкторе при вызове из bMethod(), используя theClassInput?

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Передача объекта не очищает обработчики событий. Вы должны случайно создать новый объект где-нибудь по пути вместо передачи оригинального.

0 голосов
/ 27 июля 2011

Сделайте его универсальным и передайте его TheClass

bMethod<T>(T obj) where T : IHasEvent {
  obj.RaiseEvent();
}

после прочтения комментария выше, я действительно поставил на вызов GetHashCode с обеих сторон, будет не совпадать.

...