传递实例对象时事件订阅丢失
本文关键字:事件 实例 对象 | 更新日期: 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
相同的对象,它不会对触发事件产生影响。关于如何在使用theClassInput
从bMethod()
内调用订阅时在构造函数中保留订阅,有什么想法吗?
传递对象不会清除事件处理程序。在此过程中,您必须意外地在某处创建一个新对象,而不是传递原始对象。
将其设为泛型并传递给class
bMethod<T>(T obj) where T : IHasEvent {
obj.RaiseEvent();
}
看完上面的评论后,我真的打赌两边的GetHashCode调用将与不匹配。