Реорганизовать метод расширения не очень просто, потому что единственный способ ссылаться на событие в C # - подписаться (+=
) на него или отписаться (-=
) от него (если только он не объявлен втекущий класс).
Вы можете использовать тот же подход, что и в Reactive Extensions: Observable.FromEvent
принимает двух делегатов, чтобы подписаться на событие и отказаться от него.Таким образом, вы могли бы сделать что-то вроде этого:
public static class EventHelper
{
public static void SubscribeOneShot(
Action<EventHandler> subscribe,
Action<EventHandler> unsubscribe,
EventHandler handler)
{
EventHandler actualHandler = null;
actualHandler = (sender, e) =>
{
unsubscribe(actualHandler);
handler(sender, e);
};
subscribe(actualHandler);
}
}
...
Foo f = new Foo();
EventHelper.SubscribeOneShot(
handler => f.Bar += handler,
handler => f.Bar -= handler,
(sender, e) => { /* whatever */ });