Dot-Net
EventInfo.GetRaiseMethod() 始終為空
我有:
event EventHandler MyEvent; MyEvent += new EventHandler(someHandler); if(this.GetEvent("MyEvent").GetRaiseMethod() == null) { // Always true... }但為什麼?添加處理程序後,不
GetRaiseMethod()應該設置為someHandler’sMethodInfo嗎?
這是 C# 的一個怪癖,它不支持 raise 訪問器。僅添加和刪除。其他 .NET 語言,如 VB.NET、F# 和 C++/CLI 確實支持它們,並且在 CLI 規範中對其進行了很好的定義,在該規範中命名為“fire”。
很難解釋為什麼 C# 團隊跳過了它,我從來沒有見過一個很好的解釋。純粹的猜測:這可能與他們希望避免為沒有人訂閱的事件建構事件參數的成本有關。在 GUI 框架中很常見。有點損失,C# 程序員編寫標準 raise 事件模式以及在忘記檢查 null 時診斷 NRE 肯定已經浪費了數十萬小時。C# v6 中的 elvis 運算符 (
?.) 終於讓它變得更容易了。無論如何,如果您反映用 C# 編寫的程式碼,您將永遠不會從 GetRaiseMethod() 獲得任何內容。但是,當它用 VB.NET、F# 或 C++/CLI 編寫時,您總是會得到一個非空值。如果您需要通過反射引發事件,則必須探勘支持委託變數,這可能會很痛苦。如果使用了自動生成的添加/刪除訪問器,則支持變數與事件具有相同的名稱,您可以使用 Type.GetField() 檢索它,使用 BindingFlags.NonPublic | BindingFlags.Instance。