Как подписаться на события другого класса в С#?

Простой сценарий: настраиваемый класс, который вызывает событие. Я хочу поглотить это событие внутри формы и отреагировать на него. Как мне это сделать? Примеры кода, пожалуйста!

Обратите внимание, что форма и пользовательский класс являются отдельными классами.

Ответы

Ответ 1

        public class EventThrower
        {
            public delegate void EventHandler(object sender, EventArgs args) ;
            public event EventHandler ThrowEvent = delegate{};

            public void SomethingHappened()
            {
                ThrowEvent(this, new EventArgs());
            }
        }

        public class EventSubscriber
        {
            private EventThrower _Thrower;

            public EventSubscriber()
            {
                _Thrower = new EventThrower();
                //using lambda expression..could use method like other answers on here
                _Thrower.ThrowEvent += (sender, args) => { DoSomething(); };
            }

            private void DoSomething()
            {
               //Handle event.....
            }
        }

Ответ 2

Внутри вашей формы:

void SubscribeToEvent(OtherClass theInstance)
{
    theInstance.SomeEvent += this.MyEventHandler;
}

void MyEventHandler(object sender, EventArgs args)
{
    // Do something on the event
}

Вы просто подписываетесь на мероприятие на другом классе так же, как и на событие в своей форме. Три важные вещи, которые нужно запомнить:

1) Вы должны убедиться, что ваш метод (обработчик событий) имеет соответствующее объявление, которое соответствует типу делегирования события в другом классе.

2) Событие на другом классе должно быть видимым для вас (то есть: общедоступным или внутренним).

3) Подпишитесь на действительный экземпляр класса, а не на сам класс.

Ответ 3

Предполагая, что ваше событие обработано EventHandler, этот код работает:

protected void Page_Load(object sender, EventArgs e)
{
    MyClass myObj = new MyClass();
    myObj.MyEvent += new EventHandler(this.HandleCustomEvent);
}

private void HandleCustomEvent(object sender, EventArgs e)
{
    //handle the event
}

Если вашему "настраиваемому событию" требуется какая-то другая подпись для обработки, вам нужно будет использовать его вместо этого.