using System;
namespace TestDelegate
{
delegate void EventDelegate(int eventContainerID);
class EventContainer
{
private int id;
public EventContainer(int id)
{
this.id = id;
}
public event EventDelegate Event;
public void Action()
{
this.OnEvent();
}
protected void OnEvent()
{
if(this.Event != null)
{
this.Event(this.id);
}
}
public EventDelegate GetEventDelegate()
{
return this.Event;
}
}
class Program
{
static EventContainer eventContainer1, eventContainer2;
static void ActionTest(int testNo)
{
Console.WriteLine("Test No: {0}", testNo);
Console.WriteLine("First container action begin.");
eventContainer1.Action();
Console.WriteLine("First container action end.");
Console.WriteLine("Second container action begin.");
eventContainer2.Action();
Console.WriteLine("Second container action end.");
Console.WriteLine();
}
static void EventContainer_Event_FirstVariant(int eventContainerID)
{
Console.WriteLine("Handler type A: container ID is {0}", eventContainerID);
}
static void EventContainer_Event_SecondVariant(int eventContainerID)
{
Console.WriteLine("Handler type B: container ID is {0}", eventContainerID);
}
static void Main()
{
eventContainer1 = new EventContainer(1);
eventContainer2 = new EventContainer(1);
eventContainer1.Event += new EventDelegate(EventContainer_Event_FirstVariant);
eventContainer1.Event += new EventDelegate(EventContainer_Event_FirstVariant);
eventContainer1.Event += new EventDelegate(EventContainer_Event_SecondVariant);
ActionTest(1);
eventContainer2.Event += eventContainer1.GetEventDelegate();
ActionTest(2);
Console.ReadLine();
}
}
}
Фича event'ов в том, что вне класса, где они объявлены, у них открытыми являются лишь операции add и remove. Доступ к delegate, на котором основан event, возможен только изнутри класса. Если изнутри объекта вернуть делегат (см. метод GetEventDelegate), то его можно добавить к событию другого объекта.
Всё это, мягко говоря, не здорово, извращённый подход какой-то.
bwwebm, ты суть всё же объясни. Обычно за словами "долго объяснять" скрывается непонимание задачи, и такой подход сводится к анекдоту "некогда думать, прыгать надо".
Для меня подобные хакерские подходы "лошадью" оправданы лишь в случае сопровождения старой системы, которую перепроектировать во много раз затратнее, чем хакнуть.