2010-02-11 53 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是一种网络方法,完成后将导致发起事件。完成处理程序HandleRetrieveCompleted的主体(未显示)将调用ManualResetEvent(作为UserState对象传入)的Set()。

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

} 

回答

5

你不 - 事件就像一个属性,它是围绕一对的方法(添加/删除,而不是一个属性的get/set)只是语法糖。 F#实际上公开事件为一等公民,但C#不:(

有几个选择,但:

  • 传递一个“事件订阅”代表你与呼叫要添加新的处理程序(和潜在退订委托的事件太)事情是这样的:

    new Receiver(handler => button.Click += handler, ...) 
    
  • 传递一个EventInfo与反思(urgh)认购

  • 查找到无扩展的框架,它具有处理事件(使用反射的各种方式,但它意味着微软确实反映工作,而不是你:)

如果我们知道我们可以提供更好的建议更大的图片 - 谨慎地通知我们更多?

编辑:好的,所以在这种情况下,你需要在订阅和退订代码都经过:

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

这是非常讨厌的,无可否认。你可能会发现在Reactive Extensions中有更好的东西,但那至少可以起作用...

+0

我已经编辑了这个问题,以提供更多关于我想要实现的内容的内容。 – 2010-02-12 04:15:06

+0

呃,这与多个类无法发布相同事件以及使用强引用*(C#程序中内存泄漏的第一个原因)*以及令人难以置信的**不必要冗长的事件他们使用的语法*(必须手动检查每个调用中的空值?真的!?)* ...我认为事件需要C#5.0的完整返工 – 2012-08-08 18:22:48

+0

@ BlueRaja-DannyPflughoeft我认为代码冗长的情况也是如此,有关.NET事件的更多问题和限制。为了解决这个问题,或者至少有一个很好的选择,我写了一些可用的代码,请查阅这篇文章:http://www.codeproject.com/Articles/864690/Simplifying-Events-in-NET以获取更多信息。 – 2015-01-30 07:58:59

相关问题