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

本文关键字:事件 实例 对象 | 更新日期: 2023-09-27 18:03:38

我创建了一个具有事件(TheEvent)的外部类(TheClass),并从另一个类的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()中,我调用由theClassInput暴露的方法RaiseEvent(),它将实际触发事件。在RaiseEvent()中我有

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

确保某些内容已订阅到事件,但this.TheEvent等于null。如果我将订阅放在bMethod()

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

它工作得很好,但我想把它保留在Panel的构造函数中。我认为,因为theClassInput指向与theClassInstance相同的对象,它不会对触发事件产生影响。关于如何在使用theClassInputbMethod()内调用订阅时在构造函数中保留订阅,有什么想法吗?

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

传递对象不会清除事件处理程序。在此过程中,您必须意外地在某处创建一个新对象,而不是传递原始对象。

将其设为泛型并传递给class

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

看完上面的评论后,我真的打赌两边的GetHashCode调用将不匹配。