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, ты суть всё же объясни. Обычно за словами "долго объяснять" скрывается непонимание задачи, и такой подход сводится к анекдоту "некогда думать, прыгать надо".
Для меня подобные хакерские подходы "лошадью" оправданы лишь в случае сопровождения старой системы, которую перепроектировать во много раз затратнее, чем хакнуть.