2010-02-11 7 views
4

Я хочу передать событие в метод. Код, который у меня есть, выглядит следующим образом, но что я ставил для типа «XXX»?Передача события в качестве аргумента в метод

internal class Retriever<TEventArgs> where TEventArgs : EventArgs 
{ 
    public Retriever(XXX event, EventHandler<TEventArgs> handler) 
    { 
     _event = event; 
     _handler = handler; 

     _event += handler; 
    } 

    XXX _event; 
    EventHandler<TEventArgs> _handler; 
} 

Редактировать: Разработка вопроса. Я пытаюсь написать генератор событий, где событие подписано до возникновения события и после того, как событие произошло. Этот класс будет выглядеть так:

internal class EventGuard<TEventArgs> : IDisposable where TEventArgs : EventArgs 
{ 
    public Retriever(XXX event, EventHandler<TEventArgs> handler) 
    { 
     _event = event; 
     _handler = handler; 

     _event += handler; 
    } 

    XXX _event; 
    EventHandler<TEventArgs> _handler; 

    public void Dispose() 
    { 
     _event -= _handler; 
    } 
} 

, и я буду использовать его следующим образом. Proxy.RetrieveAsync - это веб-метод, который после завершения вызовет событие Proxy.RetrieveCompleted. Тело обработчика завершения HandleRetrieveCompleted, который не показан, вызовет Set() в ManualResetEvent (передан как объект UserState).

using (new EventGuard<EventArgs>(Proxy.RetrieveCompleted, new EventHandler<EventArgs>(HandleRetrieveCompleted))) 
{ 
    ManualResetEvent resetEvent = new ManualResetEvent(); 
    Proxy.RetrieveAsync(resetEvent); 
    resetEvent.WaitOne(); 

} 

ответ

5

Вы не - событие, как свойство, это просто синтаксический сахар вокруг пары методов (добавить/удалить вместо получения/установки для свойства). F # фактически делает выставить события в качестве первых граждан класса, но C# не :(

Есть несколько вариантов, хотя:

  • Pass в делегатом «событие абонент», который вы называете с новый обработчик вы хотите добавить (и, возможно, событие unsubscriber делегат тоже) что-то вроде этого:.

    new Receiver(handler => button.Click += handler, ...) 
    
  • Pass в EventInfo и подписываться с отражением (Urgh)

  • Посмотрите в рамках Реактивные Extensions, которая имеет различные способы работы с событиями (с помощью отражения, но это означает, что Microsoft делает работу отражения, а не вы :)

Мы могли бы дать лучший совет, если мы знали, большая картина - позаботиться о том, чтобы сообщить нам больше?

EDIT: Хорошо, так что в этом случае вам нужно пройти в обоих подписки и отписки код:

using (new EventGuard<EventArgs>(h => Proxy.RetrieveCompleted += h, 
      h => Proxy.RetrieveCompleted -= h, 
      HandleRetrieveCompleted)) 
{ 
    ... 
} 

Это довольно противно, правда. Вы можете найти что-то приятнее в Reactive Extensions, но это хотя бы сработало бы ...

+0

Я отредактировал вопрос, чтобы дать больше контекста тому, чего я пытаюсь достичь. –

+0

ugh, это связано с тем, что несколько классов не могут публиковать одно и то же событие, а также события с использованием сильных ссылок * (причина № 1 для утечек памяти в программах на C#) *, плюс ** невероятно ** излишне подробные синтаксис, который они используют * (нужно вручную проверить нули при каждом вызове? Действительно!?) * ... Я думаю, что события нуждаются в полной доработке для C# 5.0 –

+0

@ BlueRaja-DannyPflughoeft Я думаю, что то же самое касается кода многословным, и есть больше проблем и ограничений в .NET-событии. Чтобы решить эту проблему или, по крайней мере, иметь хорошую альтернативу, я пишу код, который может быть полезен, пожалуйста, просмотрите эту статью: http://www.codeproject.com/Articles/864690/Simplifying-Events-in-NET для получения дополнительной информации , –

Смежные вопросы