簡體   English   中英

訂閱彼此的事件

[英]c# classes Subscribing to events of each other

A類有一個事件。 B類希望訂閱它。 B類有一個事件,A類想訂閱它。

我嘗試通過在A中創建類B和在B中創建類A的對象來進行嘗試。但這是一個僵局。

我在這里需要幫助...

請檢查這張圖片

灰色矩形必須是事件。 箭頭指示必須在每個班級之間引發一個事件

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();
}


}

這是您需要的代碼:

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)
    {
    }   
}

假設您遇到的問題是您沒有正確的實例來互相交談,那么以下一種方法可能會幫助您:

在類型A構造函數中,創建類型B的實例,並將引用設置為當前A實例( this )。

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();
}

您可能還想閱讀有關取消訂閱事件的信息,以確保您正確釋放資源。 檢查以下鏈接:

什么是清理事件處理程序引用的最佳實踐?

是否應該始終在Dispose方法中斷開事件處理程序的連接?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM