2010-02-11 51 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

相關問題