2016-07-23 52 views
2

我要訪問一個LinkButtonCommand事件的事件處理程序,但在片段波紋管fieldInfo爲空。爲什麼我不能使用反射獲得LinkBut​​ton事件的事件處理程序?

LinkButton button = new LinkButton(); 
button.Command += (s, e) => { }; 
Type type = button.GetType(); 
EventInfo[] eventInfos = type.GetEvents(BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); 
foreach (EventInfo eventInfo in eventInfos) 
    if (eventInfo.Name == "Command") 
    { 
     // fieldInfo is null 
     FieldInfo fieldInfo = eventInfo.DeclaringType.GetField(eventInfo.Name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); 
     Delegate delegates = (Delegate)fieldInfo.GetValue(button); 
     foreach (Delegate handler in delegates.GetInvocationList()) 
     { 
      eventInfo.RemoveEventHandler(button, handler); 
      // or 
      eventInfo.AddEventHandler(button, handler); 
      // or do whatever with handler 
     } 
    } 

代碼片段的靈感來源於this

爲什麼fieldInfo空?

是否有另一種方式來獲得一個LinkButtonCommand事件的事件處理程序?

Hans Passant溶劑不能在LinkButton上使用Command作爲字段名稱。

+0

我假設事件有明確的添加和移除處理程序,它代表不存儲在專用領域。 –

回答

3

望着LinkCommand reference source

public event CommandEventHandler Command是 「神奇」。

LinkCommand使用基類UI.Control並且事件存儲在protected EventHandlerList Events中。

LinkCommand也有一個名爲EventCommand的私有資產,它似乎用作Events列表的索引器。

如果我正確地閱讀源代碼,則需要提取Events[EventCommand]並將其轉換爲CommandEventHandler,如LinkButtonOnCommand中的含義。

這也似乎是使用UI.Control作爲基類的類的普遍做法。

+0

我不知道爲什麼我沒有嘗試'EventCommand'作爲字段名稱。大規模失敗。無論如何,我只是試了一下,它的工作原理。真棒!另外我應該學會更多地使用源代碼(Yay OSS)。 – Chris

+1

@Chris參考源不是開源的。你可以看看它,但在將它的任何部分合併到你自己的軟件之前,請三思。很多已經開源,https://github.com/dotnet/coreclr,https://github.com/dotnet/corefx,https://github.com/aspnet/,但我不相信WebForms。 – hvd

+0

準確地說,爲什麼我給出了一個明確的鏈接,而不是引用它,並解釋了要做什麼而不是編寫可能類似於上述參考代碼的代碼。 – Eris

相關問題