为什么我不能使用反射获取 LinkButton 事件的事件处理程序?
Why can't I get the event handler of a LinkButton's event using reflection?
我想访问 LinkButton
的 Command
事件的事件处理程序,但在下面的代码片段中 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
为空?
是否有另一种方法来获取 LinkButton
的 Command
事件的事件处理程序?
另外 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
,就像 LinkButton
在 OnCommand
中所做的那样。
这似乎也是 classes 使用 UI.Control
作为基础 class 的常见做法。
我想访问 LinkButton
的 Command
事件的事件处理程序,但在下面的代码片段中 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
为空?
是否有另一种方法来获取 LinkButton
的 Command
事件的事件处理程序?
另外 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
,就像 LinkButton
在 OnCommand
中所做的那样。
这似乎也是 classes 使用 UI.Control
作为基础 class 的常见做法。