Вывод в обратном порядке цепочки обработчиков событий - C#
Формулировка задачи:
В методе Main происходит добавление, удаление методов в цепочке обработчиков событий.
На последнем этапе получаем цепочку, с удаленным X и добавленным Z.
Собственно вопрос, как вывести данную цепочку в обратной последовательности
namespace ConsoleApplication1
{
delegate void MyEventHandler();
class MyEvent
{
public event MyEventHandler activate;
public void ActEventMet()
{
if (activate != null)
activate();
}
}
class X
{
public void XHandler()
{
Console.WriteLine("Обработка объектом класса X");
}
}
class Y
{
public void YHandler()
{
Console.WriteLine("Обработка объектом класса Y");
}
}
class Z
{
public void ZHandler()
{
Console.WriteLine("Обработка объектом класса Z");
}
}
class Test_Event
{
static void handler()
{
Console.WriteLine("Обработка объектом класса Test_Event");
}
public static void Main(string[] args)
{
MyEvent ev_obj = new MyEvent();
X x_obj = new X();
Y y_obj = new Y();
Z z_obj = new Z();
Console.WriteLine("1 (первоначальный результат)");
ev_obj.activate += new MyEventHandler(handler);
ev_obj.activate += new MyEventHandler(x_obj.XHandler);
ev_obj.activate += new MyEventHandler(y_obj.YHandler);
ev_obj.ActEventMet();
Console.WriteLine("\n2 (удаление X)");
ev_obj.activate -= new MyEventHandler(x_obj.XHandler);
ev_obj.ActEventMet();
Console.WriteLine("\n3 (добавление Z)");
ev_obj.activate += new MyEventHandler(z_obj.ZHandler);
ev_obj.ActEventMet();
Console.WriteLine("\n4 (обратный порядок)");
// необходимо сделать
Console.ReadKey();
}
}
}Решение задачи: «Вывод в обратном порядке цепочки обработчиков событий»
textual
Листинг программы
class MyEvent
{
public event MyEventHandler activate;
public void ActEventMet()
{
if (activate != null)
activate();
}
public void ActEventMetReverse()
{
var activator = activate;
if (activator == null) return;
var handlers = activator.GetInvocationList();
for (int i = handlers .Length - 1; i >= 0; i--)
handlers[i].DynamicInvoke();
}
}