[英]Why can't I get the event handler of a LinkButton's event using reflection?
我想訪問LinkButton
的Command
事件的事件處理程序,但是在下面的代碼段中, fieldInfo
為null。
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
}
}
代碼段的靈感來自於此 。
為什么fieldInfo
null?
還有另一種方法來獲取LinkButton
的Command
事件的事件處理程序嗎?
同樣,使用Command
作為字段名稱的Hans Passant解決方案在LinkButton
上不起作用。
看一下LinkCommand
參考源 :
public event CommandEventHandler Command
是“魔術”的。
LinkCommand
使用基類UI.Control
,並將事件存儲在protected EventHandlerList Events
。
LinkCommand
還具有一個稱為EventCommand
的私有屬性,該屬性似乎用作“ Events
列表的索引器。
如果我正確地閱讀了源代碼,則需要提取Events[EventCommand]
並將其轉換為CommandEventHandler
就像LinkButton
在OnCommand
。
對於使用UI.Control
作為基類的類,這似乎也很常見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.