Обработка событий с помощью методов расширения C#

Недавно я узнал об использовании методов расширения C# для упрощения вызова событий, и я использую их все больше и больше. Недавно я столкнулся со странной проблемой, которую я не понимаю, и мне было интересно, может ли кто-нибудь объяснить это.

Проблема возникает при попытке установить метод расширения обработчика событий в качестве обработчика другого события. Вот пример того, что я делаю:

public static class EventHandlerExtensions
{
    public static void Raise<TEventArgs>(
        this EventHandler<TEventArgs> eventHandler, 
        object sender, TEventArgs args)  where TEventArgs:EventArgs
    {
        if (eventHandler != null)
        {
            eventHandler(sender, args);
        }
    }
}

public class Test
{
    private event EventHandler<EventArgs> EventA;
    private event EventHandler<EventArgs> EventB;

    public Test()
    {
        Console.WriteLine("::Start");
        EventB += EventA.Raise;
        EventA += (s, a) => Console.WriteLine("Event A raised");
        EventB.Raise(this, EventArgs.Empty);
        Console.WriteLine("::End");
    }
}

В этом примере событие EventA должно запускаться в результате запуска события EventB. Однако, когда я запускаю этот код, EventB срабатывает, но метод расширения на A не находит для него прослушивателей.

Если я изменю порядок, все будет работать нормально:

Console.WriteLine("::Start");
EventA += (s, a) => Console.WriteLine("Event A raised");
EventB += EventA.Raise;
EventB.Raise(this, EventArgs.Empty);
Console.WriteLine("::End");

Кроме того, вызов EventA.Raise из лямбда-выражения работает нормально:

Console.WriteLine("::Start");
EventB += (s, a) => EventA.Raise(s, a);
EventA += (s, a) => Console.WriteLine("Event A raised");
EventB.Raise(this, EventArgs.Empty);
Console.WriteLine("::End");

Это просто простой пример, но я пытаюсь создать класс, который может повторно отправлять события источников событий, добавленных к нему, максимально чистым способом. Я не хочу создавать именованные методы только для повторной отправки одних и тех же событий, и я не хочу хранить списки лямбда-функций, которые я могу позже отцепить от обработчиков событий. В основном, мне просто любопытно, почему это происходит?

Есть идеи?

6
задан Alexei Levenkov 24 May 2012 в 02:04
поделиться