gpt4 book ai didi

c# - 尝试让委托(delegate)关联到控件的事件时出现问题

转载 作者:行者123 更新时间:2023-11-30 17:05:15 25 4
gpt4 key购买 nike

我正在尝试将控件序列化为 XML,并且我想序列化它们的事件处理程序。

我正在使用这段代码:

Control childCtrl = ....

if (childCtrl.GetType() == typeof(Button)) {
EventInfo baseEventInfo = childCtrl.GetType().GetEvent("Click");

EventHandlerList events =
typeof(Control).GetProperty("Events",
BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.Static |
BindingFlags.NonPublic).GetValue(childCtrl, null)
as EventHandlerList;
object eventField = typeof(Control).GetField("Event" + baseEventInfo.Name,
BindingFlags.NonPublic |
BindingFlags.Static).GetValue(childCtrl);
Delegate aDel = events[eventField];

xmlSerialisedForm.WriteElementString("Click", aDel.Method.ToString());
}

if (childCtrl.GetType() == typeof(CheckBox)) {
EventInfo baseEventInfo = childCtrl.GetType().GetEvent("CheckedChanged");

EventHandlerList events =
typeof(Control).GetProperty("Events",
BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.Static |
BindingFlags.NonPublic).GetValue(childCtrl, null)
as EventHandlerList;
//Error here: GetField returns null
object eventField = typeof(Control).GetField("Event" + baseEventInfo.Name,
BindingFlags.NonPublic |
BindingFlags.Static).GetValue(childCtrl);
Delegate aDel = events[eventField];
xmlSerialisedForm.WriteElementString("CheckedChanged", aDel.Method.ToString());
}

现在我知道复选框有一个绑定(bind)到事件 CheckedChanged 的处理程序;使用调试器时,我可以在 EventHandlerList 中看到该方法:

Enter image description here

现在,相同的代码在处理 Button 时实际上起作用了(当我想获得与 Click 事件关联的委托(delegate)时)。为什么它不适用于 CheckBox?我在这里缺少什么?

编辑:我当前的解决方法(非常难看)是我通过在 typeof(CheckBox) 上调用 GetFields 并查看数组得出的:

if (childCtrl.GetType() == typeof(CheckBox)) {
EventHandlerList events =
typeof(Control).GetProperty("Events",
BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.Static |
BindingFlags.NonPublic).GetValue(childCtrl, null)
as EventHandlerList;

object eventField =
typeof(CheckBox).GetFields(BindingFlags.NonPublic |
BindingFlags.Static)[0].GetValue(childCtrl);
Delegate aDel = events[eventField];
xmlSerialisedForm.WriteElementString("CheckedChanged", aDel.Method.ToString());
}

最佳答案

令人气愤的是,CheckedChanged 事件的编写方式似乎与 .NET 框架上的其他事件完全不同。 CheckStateChanged 也是如此。他们在这里。

typeof(CheckBox).GetField("EVENT_CHECKEDCHANGED",
BindingFlags.NonPublic |
BindingFlags.Static|
BindingFlags.Instance |
BindingFlags.FlattenHierarchy);
typeof(CheckBox).GetField("EVENT_CHECKSTATECHANGED",
BindingFlags.NonPublic |
BindingFlags.Static|
BindingFlags.Instance |
BindingFlags.FlattenHierarchy);

为了让它更特别,您不能将所有内容都视为 CheckBox,否则您将获得仅有的两个事件。

关于c# - 尝试让委托(delegate)关联到控件的事件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16736573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com