传递实例对象时丢失事件订阅

时间:2011-07-27 19:38:09

标签: c# events subscription

我创建了一个带有事件(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等同于null。如果我将订阅置于bMethod()

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

它工作正常,但我想将它保留在Panel的构造函数中。我认为因为theClassInput指向与theClassInstance相同的对象,所以触发事件不会产生任何影响。有关如何使用bMethod()theClassInput内调用订阅时在构造函数中保留订阅的任何想法?

2 个答案:

答案 0 :(得分:2)

传递对象不会清除事件处理程序。你必须在途中不小心创建一个新对象,而不是传递原始对象。

答案 1 :(得分:0)

将其变为泛型并将其传递给TheClass

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

在阅读上面的评论后,我真的打赌围栏两侧的GetHashCode调用,匹配。