Хороший способ связать все события класса с соответствующими обработчиками [дубликат]C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Хороший способ связать все события класса с соответствующими обработчиками [дубликат]

Сообщение Anonymous »

Моя программа состоит из главного окна и других экранов, которые появляются по запросу. Разные экраны выполняют разные действия, поэтому все они определяют разные СОБЫТИЯ, которые можно вызвать при нажатии кнопки. Все экраны наследуются от базового класса SCREEN. Все экраны имеют одно общее СОБЫТИЕ — «ReturnRequest».
Вот как оно выглядит:

Код: Выделить всё

public class Screen
{
public virtual event Action ReturnRequest;

public Screen()
{ }
}

public class MainMenuScreen : Screen
{
public override event Action ReturnRequest;
public event Action ExitRequest;
public event Action NewGameRequest;
public event Action LoadRequest;
public event Action SaveRequest;

public MainMenuScreen(){}
}

public class DeathScreen : Screen
{
public override event Action ReturnRequest;
public event Action ExitRequest;

public DeathScreen(){}
}
Основная логика программы связывает события разных экранов с их обработчиками, вот так:

Код: Выделить всё

public void ConnectAllScreenEvents(Screen screen)
{
screen.ReturnRequest += ReturnFromScreen;

if (screen.GetType() == typeof(MainMenuScreen))
{
MainMenuScreen _screen = screen as MainMenuScreen;
_screen.ExitRequest += Exit;
_screen.LoadRequest += DeSerializeGame;
_screen.NewGameRequest += NewGame;
_screen.SaveRequest += SerializeGame;
}
else if (screen.GetType() == typeof(DeathScreen))
{
DeathScreen _screen = screen as DeathScreen;
_screen.ExitRequest += Exit;
}
Отключение работает таким же образом.
Этот код на самом деле работает нормально. Однако мне кажется, что это очень неуклюжая реализация. Очевидные проблемы заключаются в том, что дерево if/else будет становиться все больше и больше, чем больше экранов и событий я определяю. Также не возникает ошибки, если я забуду подключить или отключить определенное событие.
Итак. Я ищу умную однострочную программу, которая связывает ВСЕ события экрана с их обработчиками. Моя концепция такова:
  • Каждый экран помещает все свои события в список под названием «Все действия». Пример:

    Код: Выделить всё

    public Action[] AllActions = new Action[4] { ExitRequest, NewGameRequest, LoadRequest, SaveRequest };
  • Основная логика получает словарь, который сообщает, какое событие с чем связано.
    < /li>

Код: Выделить всё

private Dictionary ActionToHandler= new Dictionary();

ActionToHandler.Add("ExitRequest", Exit);
ActionToHandler.Add("NewGameRequest", NewGame);
ActionToHandler.Add("LoadRequest", DeSerializeGame);
ActionToHandler.Add("SaveRequest", SerializeGame);
  • Метод ConnectAllScreenEvents должен превратиться в нечто подобное;

Код: Выделить всё

   public void ConnectAllScreenEvents(Screen screen)
{
screen.ReturnRequest += ReturnFromScreen;

for (int i = 0; i < screen.AllActions.Length; i++)
{
string actionName = screen.AllActions[i].ToString();
Action handler = ActionToSlot[actionName];
screen.AllActions[i] += handler;
}
}
Однако это не работает. Все действия внутри метода ConnectAllScreenEvents имеют значение null. Я думаю, что это может сработать, но я просто не могу понять правильный синтаксис C# для этого. Все советы приветствуются.

Подробнее здесь: https://stackoverflow.com/questions/790 ... e-handlers
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»