Как подписаться на события другого класса в С#?
Простой сценарий: настраиваемый класс, который вызывает событие. Я хочу поглотить это событие внутри формы и отреагировать на него. Как мне это сделать? Примеры кода, пожалуйста!
Обратите внимание, что форма и пользовательский класс являются отдельными классами.
Ответы
Ответ 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
}
Если вашему "настраиваемому событию" требуется какая-то другая подпись для обработки, вам нужно будет использовать его вместо этого.