6

有沒有辦法執行事件處理連接的編譯時間實施?執行事件處理連接

因此,例如讓我說我有一個類,公開標準EventHandler<T>我可以確保該類的任何實例化的實例有OnMyEvent處理程序,處理? (最好在編譯時)

我可以看到執行此操作的唯一方法是將事件處理程序作爲對象構造函數的一部分或在運行時使用反射。有沒有其他的選擇?另外,如果C#不允許使用此功能,則可以使用此功能;但是,如果C#不允許使用此功能,則不需要使用此功能;否則,如果C#不允許使用此功能,出於好奇做任何其他語言?

回答

3

事件是通常用於可選消耗由所述對象的調用代碼 - 例如,作爲一個觀察者(或多個觀察者)。處理該事件的情況非常罕見,即強制執行。沒有標準的語言/編譯器構造來驗證在編譯時訂閱的事件(我懷疑這會非常困難,因爲您可以隨時在代碼中的任何位置有效地訂閱/取消訂閱 - 可能多次,即+ HandlerA,+ HandlerB,-HandlerA,-HandlerB-以沒有訂閱者結束)。

在你目前的情況下,它是需要,然後將它傳遞到構造聽起來更合適,但我可能會在這種情況下(不EventHandler<T>)使用Func<...>Action<...>。但這是主觀的。

其他方法:

  • 使它成爲一個抽象類,並迫使消費者繼承和override一個或更多的abstract成員
  • 有消費者必須提供
+0

interface參數謝謝你的答案。 :-) – 2011-05-31 14:22:17

+0

+1,用於解決OP所存在的一些根本問題和誤解。我還會補充一點,如果你有一個構建腳本在構建之後運行單元測試,那麼你可以在構建過程中執行許多事情,而編譯器本身不能。 – Phil 2012-08-09 10:49:25