c#classes订阅彼此的事件

时间:2017-07-10 04:36:50

标签: c# events c#-4.0

A班有一个事件。 B级想要订阅它。 B类有一个事件,A类想要订阅它。

我尝试在A中创建B类对象,在B中创建A类。但这是一个僵局。

我在这里需要帮助......

Please check this image

灰色矩形必须是事件。箭头表示必须从一个类提升到一个类

class A
{
B b;
public event EventHandler eventA;

OnEventA()
{
eventA();
}

public A()
{
b= new B();
b.eventB += DoSomethingElse();
}

}


class B
{
A a;
public B()
{
    a= new A();
    a.eventA += DoSomething();
}
public event EventHandler eventB;

OnEventB()
{
eventB();
}


}

2 个答案:

答案 0 :(得分:1)

以下是您需要的代码:

class A
{
    B b;
    public event EventHandler eventA;

    void OnEventA()
    {
        var ea = this.eventA;
        if (ea != null)
        {
            ea(this, new EventArgs());
        }
    }

    public A()
    {
        this.b = new B(this);
        this.b.eventB += DoSomethingElse;
    }

    private void DoSomethingElse(object sender, EventArgs e)
    {
    }
}

class B
{
    A a;
    public B(A a)
    {
        this.a = a;
        this.a.eventA += DoSomething;
    }
    public event EventHandler eventB;

    void OnEventB()
    {
        var eb = this.eventB;
        if (eb != null)
        {
            eb(this, new EventArgs());
        }       
    }

    private void DoSomething(object sender, EventArgs e)
    {
    }   
}

答案 1 :(得分:1)

假设您的问题是您没有获得正确的实例来互相交流,这里有一种方法可以帮助您:

在类型A的构造函数中,创建类型B的实例,并将引用设置为当前Athis)的实例。

public A()
{
    // give B reference to A
    b = new B(this);
    // subscribe A to B's event
    b.eventB += DoSomethingElse();
}

为了实现这一点,您需要让B类型的构造函数接受对A的引用,如下所示:

public B(A a)
{
    // subscribe B to A's event
    a.eventA += DoSomething();
}

您可能还想阅读取消订阅事件,以确保正确释放资源。请查看以下链接:

What best practices for cleaning up event handler references?

Should I always disconnect event handlers in the Dispose method?