2017-05-01 20 views
1

我試圖確定Click事件訂閱的方法,在我的表單中,我按照指南hereGetField無法獲取EventClick

鑑於論壇的帖子上面能夠得到的Click事件訂閱列表,通過下面的代碼

hasClickEventHandler = HasEventHandler(buttonControl, "EventClick"); 
    Assert.AreEqual(hasClickEventHandler, true); 


    private bool HasEventHandler(Control control, string eventName) 
    { 
     EventHandlerList events = 
      (EventHandlerList) 
      typeof(Component) 
      .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance) 
      .GetValue(control, null); 

     object key = typeof(Control) 
      .GetField(eventName, BindingFlags.NonPublic | BindingFlags.Static) 
      .GetValue(null); 

     Delegate handlers = events[key]; 

     return handlers != null && handlers.GetInvocationList().Any(); 
    } 

我不能。

然後我用var keys = typeof(Control).GetFields(BindingFlags.NonPublic | BindingFlags.Static);來檢查,我發現其中一個Keys似乎有正確的事件名稱。即,

keys[19].FullName=="System.Windows.Forms.Control.EventClick"; 
keys[19].Name=="EventClick"; 

所以沒有理由

object key = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static) 

而且

object key = typeof(Control).GetField("System.Windows.Forms.Control.EventClick", BindingFlags.NonPublic | BindingFlags.Static) 

返回null,然而這正是發生

爲什麼會這樣呢?出了什麼問題?

這裏是我的確切代碼

 var form = new Form1(); 
     EventHandlerList events = (EventHandlerList)typeof(Control) 
      .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance) 
      .GetValue(form, null); 
     var keys = typeof(Control).GetFields(BindingFlags.NonPublic | BindingFlags.Static); 
     var name = keys[19].Name; //name="EventClick" 
     object key = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); //null 

編輯: 我可以重現.Net的4.5.2的行爲,但是,.Net的4.6,關鍵是有效的對象。這似乎是.Net 4.5.2中的一個特定錯誤。

+0

嗯...看起來像它應該工作,確實 –

+0

@MarcGravell,它只是很不解,我已經附加我的全部代碼 – Graviton

+0

如果你發現EventClick回到索引[19],那麼你有一個非常不尋常的.NET版本。我不得不猜測在.NET 4.7上,我的任何一臺機器上都沒有安裝它,但在那個版本中,Winforms有相當多的修補。否則,代碼的危險就像這樣。使用一個體面的反編譯器來挖掘一下。 –

回答

1

我的解決方案:將目標從.Net 4.5.2更改爲.Net 4.6可以解決問題;在.net 4.6

object key = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); 

key給出了一個有效的對象

+0

爲什麼要投票?這是一個經過驗證的解決方案 – Graviton

+0

我同意你的觀點 - 聽起來不錯 –