c# классы Подписка на события друг друга

У класса А есть событие. Класс B хочет подписаться на него. У класса B есть событие, и класс A хочет подписаться на него.

Я попытался создать объект класса B в A и класса A в B. Но это тупик.

Мне нужна помощь здесь...

Пожалуйста, проверьте это изображение

Серые прямоугольники должны быть событиями. Стрелка указывает, что событие должно передаваться от класса к классу.

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


}

person Anu    schedule 10.07.2017    source источник
comment
Тот факт, что вы пытаетесь это сделать, указывает на наличие проблемы в дизайне. Пожалуйста, предоставьте немного больше контекста проблемы, чтобы мы могли помочь вам!   -  person Bas    schedule 10.07.2017
comment
Я отредактировал вопрос. Можешь мне помочь?   -  person Anu    schedule 10.07.2017
comment
Как вы думаете, почему существует тупик? Это не должно вызывать взаимоблокировку.   -  person CodingYoshi    schedule 10.07.2017
comment
Я снова обновил код, который пробовал.   -  person Anu    schedule 10.07.2017
comment
Совершенно правильный вопрос с кодом и диаграммой. 2 минуса и близкое голосование. Что происходит с этим сайтом...   -  person CodingYoshi    schedule 10.07.2017
comment
@CodingYoshi Первая редакция поста OP не содержит никакого кода или диаграммы, что объясняет, почему у него 2 DV и близкое голосование.   -  person Tetsuya Yamamoto    schedule 10.07.2017
comment
@anu - Настоящий код был бы хорош. Ваш код не компилируется.   -  person Enigmativity    schedule 10.07.2017


Ответы (2)


Вот код, который вам нужен:

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)
    {
    }   
}
person Enigmativity    schedule 10.07.2017
comment
Вы спасли мой день. Я совершенно забыл концепцию параметризованных конструкторов. Благодаря тонну. :) - person Anu; 10.07.2017

Предполагая, что ваша проблема заключается в том, что у вас нет нужных экземпляров для общения друг с другом, вот один из подходов, который может вам помочь:

В вашем конструкторе для типа 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?< /а>

person dnickless    schedule 10.07.2017