2 события и 1 кнопка. Отписывание от одного и подписка на другое

Всем привет.

Задача: Есть 2 события (А и Б) и 1 кнопка. При выполнении события А (при клике на кнопку) происходит отписка от события А и подписка на событие Б (по аналогии с событием Б).

Сейчас у меня это выглядит так:

if(//some condition)
    Button.Click += (sender, e) => Button_Click_A(sender, e, message);
else
    Button.Click += (sender, e) => Button_Click_B(sender, e, message);

И в самих же событиях я отписываюсь от них же (извиняюсь за тавтологию):

private void Button_Click_A(object sender, EventArgs e, string message)
{
    //some code
    Button.Click -= (sender, e) => Button_Click_A(sender, e, message);
}

(2 событие такое же)

И, вроде, всё классно и это работает, но такая реализация мне крайне сильно не нравится. Может есть какой-то более красивый вариант решения этого?


Ответы (1 шт):

Автор решения: Qwertiy

Можно сделать как-то так:

private Action<object, EventArgs> currentHandler;

void doSmth()
{
  if (currentHandler != null)
    throw new InvalidOperationException("Attempt to subscribe when already subscribed");

  var message = "Some message";

  if(someCondition)
    Button.Click += currentHandler = (sender, e) => Button_Click_A(sender, e, message);
  else
    Button.Click += currentHandler = (sender, e) => Button_Click_B(sender, e, message);
}

private void Button_Click_A(object sender, EventArgs e, string message)
{
  if (currentHandler != null)
  {
    Button.Click -= currentHandler;
    currentHandler = null;
  }

  MessageBox.Show(message);
}

Хотя, в большинстве случаев можно сделать проще:

private string handlerMessage;

void doSmth()
{
  handlerMessage = "Some message";
}

private void Button_Click(object sender, EventArgs e)
{
  MessageBox.Show(handlerMessage);
}
→ Ссылка