0

我正在尝试为一个对象订阅两个事件。但是在我尝试添加事件之前,该对象没有被实例化。有没有办法可以订阅这两个事件并在之后实例化?我已经让委托、事件、事件参数和事件处理程序工作了。

示例代码:

Ares a;

public B()
{
    a.up += new upEventHandler(doUp);
    a.down += new downEventHandler(doDown);
    a = new Ares();
}
4

4 回答 4

3

我正在尝试为一个对象订阅两个事件。但是在我尝试添加事件之前,该对象没有被实例化。有没有办法可以订阅这两个事件并在之后实例化?

不,绝对不是。这就像在对象存在之前尝试在对象上设置属性一样。试着想想它是如何工作的——然后意识到订阅的事件处理程序是对象状态的一部分,就像属性一样。

显然,您可以将事件处理程序存储在其他地方并稍后订阅它们,但如前所述,答案是否定的。它在概念层面或实际层面上没有任何意义。

于 2012-07-31T17:25:04.233 回答
1

这是不可能的。您必须先实例化对象。

于 2012-07-31T17:24:37.160 回答
0

您可以做的最接近您所描述的事情就是使事件静态化。

class Ares {
    public static event upEventHandler up;
    public static event downEventHandler down;
    // ...
}

然后修改B()为:

public B() {
    Ares.up += new upEventHandler(doUp);
    Ares.down += new downEventHandler(doDown);
    a = new Ares();
}
于 2012-07-31T18:14:41.763 回答
0

我假设事件是在构造函数中触发的,并且您想要捕获它。

尝试将构造函数中的事件触发代码重构为单独的 Initialize() 方法,这样您将拥有以下内容:

Ares a;

public B()
{
    a = new Ares();
    a.up += new upEventHandler(doUp);
    a.down += new downEventHandler(doDown);

    a.Initialize(); //do all init of the ares object here, not in constructor
}
于 2012-07-31T18:49:04.583 回答