为什么我不能使用反射获取 LinkBut​​ton 事件的事件处理程序?

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

我想访问 LinkButtonCommand 事件的事件处理程序,但在下面的代码片段中 fieldInfo 为空。

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 作为字段名称。

查看 LinkCommand reference source:

public event CommandEventHandler Command 是 "magic".

LinkCommand 使用 baseclass UI.Control 并且事件存储在 protected EventHandlerList Events 中。

LinkCommand 也有一个名为 EventCommand 的私有 属性,它似乎用作 Events 列表的索引器。

如果我正确阅读源代码,您需要提取 Events[EventCommand] 并将其转换为 CommandEventHandler,就像 LinkButtonOnCommand 中所做的那样。

这似乎也是 classes 使用 UI.Control 作为基础 class 的常见做法。