我创建了一个带有事件(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
内调用订阅时在构造函数中保留订阅的任何想法?
答案 0 :(得分:2)
传递对象不会清除事件处理程序。你必须在途中不小心创建一个新对象,而不是传递原始对象。
答案 1 :(得分:0)
将其变为泛型并将其传递给TheClass
bMethod<T>(T obj) where T : IHasEvent {
obj.RaiseEvent();
}
在阅读上面的评论后,我真的打赌围栏两侧的GetHashCode调用,不匹配。