Слушать события, не зная отправителя в C #? - PullRequest
0 голосов
/ 08 сентября 2018

В настоящее время я изучаю более продвинутые темы C # и у меня есть вопросы о событиях:

Если я правильно понял, мне нужно знать объект (экземпляр), который вызывает событие, чтобы его прослушать:

class IWantToListen {
    public IWantToListen(IAmSending s) {
        s.OnTrigger += HandleTrigger;
    }

    public void HandleTrigger(object sender, EventArgs e) {
        // react to event
    }
}

public class IAmSending {
    public event EventHandler OnTrigger;

    public void TriggerEvent(EventArgs e) {
        OnTrigger(this, e);
    }
}

Чтобы мой IWantToListen экземпляр прослушивал события из моего IAmSending экземпляра, мне нужно в какой-то момент передать ссылку на этот конкретный экземпляр.

Но что, если я хочу, чтобы мои IWantToListen экземпляры прослушивали события из всех экземпляров IAmSending, и эти экземпляры создаются динамически. Мне бы пришлось вручную сообщить IWantToListen, что существует новый экземпляр IAmSending, на который он должен подписаться. Нет ли другой возможности? Я думаю, что я ищу что-то, что будет работать так:

public class IWantToListen {
    public IWantToListen() {
        EventDistributionSystem.AddListener("OnTrigger", HandleTrigger);
    }

    public void HandleTrigger(object sender, EventArgs e) {
        // react to event
    }
}

public class IAmSending {
    public void TriggerEvent(EventArgs e) {
        EventDistributionSystem.Send("OnTrigger", this, e);
    }
}

Конечно, это всего лишь грубый набросок с возможностями для улучшения, но я думаю, вы поняли идею. Во всяком случае, я не мог ни за что на свете найти то, что делает это, или даже кого-то, кто просил об этом. Я мог бы, вероятно, создать одиночный класс EventDistributionSystem самостоятельно, но тот факт, что он явно не существует, уже поднимает вопрос, есть ли причина для этого. Это считается плохим дизайном? Если да, то почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...