簡體   English   中英

為什么我不能使用反射來獲取LinkBut​​ton事件的事件處理程序?

[英]Why can't I get the event handler of a LinkButton's event using reflection?

我想訪問LinkButtonCommand事件的事件處理程序,但是在下面的代碼段中, 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?

還有另一種方法來獲取LinkButtonCommand事件的事件處理程序嗎?

同樣,使用Command作為字段名稱的Hans Passant解決方案在LinkButton上不起作用。

看一下LinkCommand參考源

public event CommandEventHandler Command是“魔術”的。

LinkCommand使用基類UI.Control ,並將事件存儲在protected EventHandlerList Events

LinkCommand還具有一個稱為EventCommand的私有屬性,該屬性似乎用作“ Events列表的索引器。

如果我正確地閱讀了源代碼,則需要提取Events[EventCommand]並將其轉換為CommandEventHandler就像LinkButtonOnCommand

對於使用UI.Control作為基類的類,這似乎也很常見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM