1. C# / Говнокод #5751

    +117

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    public static class EventExtensions
        {
            public static void Fire(this EventHandler eventHandler, object sender)
            {
                eventHandler.Fire(sender, EventArgs.Empty);
            }
    
            public static void Fire(this EventHandler eventHandler, object sender, EventArgs args)
            {
                eventHandler.FireDelegate(sender, args);
            }
    
            public static void Fire<TEA>(this EventHandler<TEA> eventHandler, object sender, TEA args)
                where TEA : EventArgs
            {
                eventHandler .FireDelegate(sender, args);
            }
    
            public static void FireDelegate(this Delegate eventHandler, params object[] parameters)
            {
                if (eventHandler != null)
                {
                    Delegate[] delegates = eventHandler.GetInvocationList();
                    foreach (var del in delegates)
                    {
                        try
                        {
                            del.Method.Invoke(del.Target, parameters);
                        }
                        catch (Exception e)
                        {
                            // use logger here
                            throw;
                        }
                    }
                }
            }
        }

    Надоело писать инвокаторы для ивентов? Как тебе это?

    Запостил: walash, 21 Февраля 2011

    Комментарии (4) RSS

    • На самом деле идея правильная, но реализация, конечно, гавно.

      public static void Raise<T>(this EventHandler<T> eventHandler, object sender, T e) where T : EventArgs
      {
      	if (eventHandler != null)
      	{
      		eventHandler(sender, e);
      	}
      }
      больше не нужна каждый раз проверка на null.
      а самое главное - этот экст-метод страхует от зануления хендлера в момент между проверкой и выстрелом
      Ответить
      • Да, и потом мучаться в догадках откуда пришло событие и почему именно сейчас... недавно на практике познакомился с подобным решением.
        А еще лучше, если над проектом работет много людей. Можно изподтишка от имени чужого компонента диспатчить какие-нибудь левые события, а потом, естесственно, всю вину валить на соседа :)
        Ответить
        • The event 'ConsoleApplication1.Bar.TestEvent' can only appear on the left hand side of += or -= (except when used from within the type 'ConsoleApplication1.Bar')

          т.е. через этот метод вызвать событие "из вне" не получится
          а запихнуть в sender бог весть что оно и так можно
          Ответить
          • Просто, если событие описано в классе, и там вдруг отправитель не традиционно указан, это сразу в глаза бросится, а при таком раскладе легко пропустить (что вобщем-то и происходит в проекте о котором говорю). Т.е. предствьте следующий шаг лентяя (без обвинений) - захочется всех отправителей сложить списком и от всех по-очереди чего-нибудь продиспатчить, и вот тут наступает...
            Ответить

    Добавить комментарий