Как узнать, сработало ли событие в другом обработчике событий без использования флагов? - PullRequest
1 голос
/ 30 декабря 2011

У меня есть два события A и B.

Мне нужно проверить в обработчике события B, было ли вызвано событие A.Я знаю, что могу сделать это, используя флаг, но я использовал так много флагов для подобных ситуаций;и хотите использовать альтернативную стратегию.

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Для меня это звучит как плохой дизайн.Если событие A возникло, это должно было сделать что-то вроде изменения состояния некоторого экземпляра объекта.Таким образом, если событие B поднято, проверяя изменения состояния, сделанные событием A, вы должны знать, было ли оно поднято или нет.Если я ошибаюсь с точки зрения плохого дизайна, то, пожалуйста, опубликуйте больше информации о вашем решении.

Пример:

void eventOfA(EventArgs args)
{
    // modify application or whatever state like
    myAppContext.ChangeStatus(2);
    // or
    myWhateverInstance.DoStuff();
}

void eventOfB(EventArgs args)
{
   if(myAppContext.Status == 2)
       // eventOfA was raised
   else
       // eventOfA was not raised

   // or
   if(myWhateverInstance.DidStuff)
       // eventOfA was raised
   else
       // eventOfA was not raised

}
0 голосов
/ 31 декабря 2011
  1. Может быть, вам следует пересмотреть семантику ваших событий и создать другую. Скажем, если у вас есть события MyApplicationExit и SaveMyData, и вам не нужно сохранять все, когда приложение завершит работу сразу после этого, вы действительно можете проверить в обработчике SaveMyData, был ли вызван MyApplicationExit ранее. Но гораздо лучшим выбором было бы создание другого события SaveMyDataOnExit, которое вы отправляете, когда вы выходите, и пользователь хочет, чтобы что-то было сохранено. Не так много работы добавлено, так как вы должны дифференцировать каждый случай.
  2. Все, что вам нужно - это булевы для событий? Потому что, если обработка событий .Net вам не подходит, вы можете также написать собственный EventHandler для своих пользовательских событий, определяя значение AddHandler, RemoveHandler и RaiseEvent. Таким образом, вы можете создавать любые сложные отношения между событиями, как, например, создание одного события может автоматически - или с условием для события - вызывать другое событие, или что-либо еще, что лучше соответствует вашим потребностям.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...