如何使用反射将事件处理程序附加到事件?

2023-11-22

我知道关于EventInfo.AddEventHandler(...)可用于将处理程序附加到事件的方法。但是,如果我什至无法定义事件处理程序的正确签名(例如,我什至没有引用处理程序所需的事件参数),该怎么办?

我将用正确的代码解释问题。

// 当我的解决方案中拥有所有可用内容时的场景,零反射场景。

internal class SendCommentsManager
{
    public void Customize(IRFQWindowManager rfqWindowManager)
    {
        rfqWindowManager.SendComment += HandleRfqSendComment;
    }

    private void HandleRfqSendComment(object sender, SendCommentEventArgs args)
    {
        args.Cancel = true;
    }
}

现在,我想通过使用反射来实现相同的目标。我已经能够弄清楚其中的大部分内容,但是当我将委托附加到事件时(使用AddEventHandler)它抛出"Error binding to target method."例外。

我理解此异常背后的原因,将错误的委托附加到事件。但必须有某种方法来实现这一目标。

 internal class SendCommentsManagerUsingReflection
 {
     public void Customize(IRFQWindowManager rfqWindowManager)
     {
         EventInfo eventInfo = rfqWindowManager.GetType().GetEvent("SendComment");
         eventInfo.AddEventHandler(rfqWindowManager, 
             Delegate.CreateDelegate(eventInfo.EventHandlerType, this, "HandleRfqSendComment"));
         //<<<<<<<<<<ABOVE LINE IS WHERE I AM GOING WRONG>>>>>>>>>>>>>>
     }

     private void HandleRfqSendComment(object sender, object args)
     {
         Type sendCommentArgsType = args.GetType();
         PropertyInfo cancelProperty = sendCommentArgsType.GetProperty("Cancel");
         cancelProperty.SetValue(args, true, null);
     }
 }

我认为你的代码失败了,因为HandleRfqSendComment是私人的。相反,您可以直接创建该方法的委托,而无需将其名称传递给CreateDelegate。然后,您需要使用以下方法将委托转换为所需的类型:

public static Delegate ConvertDelegate(Delegate originalDelegate, Type targetDelegateType)
{
    return Delegate.CreateDelegate(
        targetDelegateType,
        originalDelegate.Target,
        originalDelegate.Method);
}

在您的代码中,您可以按如下方式使用此方法:

EventInfo eventInfo = rfqWindowManager.GetType().GetEvent("SendComment");
Action<object, object> handler = HandleRfqSendComment;
Delegate convertedHandler = ConvertDelegate(handler, eventInfo.EventHandlerType);
eventInfo.AddEventHandler(rfqWindowManager, convertedHandler);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用反射将事件处理程序附加到事件? 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • C# 中空合并赋值运算符的实际用途?

    C 中的空值 C 的一项新功能使我们能够去掉代码中的空值 with 可为空的引用类型 我们鼓励添加
  • python中求最小值和最大值

    我必须要求用户输入一些数字 然后打印大小 总和 平均值 最小值和最大值 我可以得到前三件事 但我被困在最小和最大的一个上 我遇到的问题是我无法使用sort 因为我需要使列表成为整数一 但你不能使用整数列表split 这是我的代码 numbe
  • 有没有更好的方法在 bash 中运行命令 N 次?

    我偶尔会运行这样的 bash 命令行 n 0 while n lt 10 do some command n n 1 done To run some command连续多次 在本例中为 10 次 Often some command实际上
  • “错误:找不到符号 HashMap”[重复]

    这个问题在这里已经有答案了 尝试创建 或者更确切地说学习 a HashMap以下方式 public class Demo public static void main String args System out println Star
  •  编码问题

    我正在使用 PHP 开发一个网站 这些奇怪的字符 出现在我的页面上 就在它的顶部 我的代码是这样的 但是当我在浏览器中查看源代码时 它显示
  • 实体框架失去 Sql DateTime 精度

    我正在使用 Entity SQL 查询我的 EDM 但我的 DateTime 值失去了毫秒精度 例如 2011 7 20 12 55 15 333 PM 更改为 2011 7 20 12 55 15 000 PM 我已经确认在 SQL 中毫
  • 按子数组键值对多维数组进行排序

    为此发布了类似的问题和答案 但没有一个与我的数组的结构完全匹配 所以如果我错过了一些东西 我深表歉意 这是由 WordPress wpdb 类生成的数组 Array 0 gt Array meta id gt 37850 post id g
  • 如何在纯SQL中编写空安全比较“<=>”?

    在Mysql中有一个比较运算符是空安全的 我在 Java 程序中创建准备好的语句时使用它 如下所示 String routerAddress getSomeValue String sql SELECT FROM ROUTERS WHERE
  • 正则表达式匹配字母字符[重复]

    这个问题在这里已经有答案了 我有这个正则表达式 if cadena matches a zA Z return true 它接受从 A 到 Z 的小写和大写 还接受空格 但这仅适用于英语 例如 在加泰罗尼亚语中 我们有 字符 此外 我们还有
  • .NET 3.5 的代码契约搞乱了 VS10 的调试器

    我最近使用代码契约迁移了很多手动前提条件测试和异常抛出 我没有升级到 NET 4 而是使用Microsoft Contracts dll程序集 这样我就可以坚持使用 NET 3 5 更长的时间 这是一个由 NET 3 5 和 NET 4 程
  • 使用 window.find() 匹配所有出现的情况

    例如 如果我有一个如下所示的 HTML 网页 Hello Techies br Techies here 如果我使用搜索 Techies var sel window getSelection sel collapse document b
  • n 行的平均值

    我有一个包含三列的数据框 Id Date and Value并希望按平均值对其进行下采样 取接下来的 20 行 构建平均值Value从这 20 行中提取数据并将其添加到具有相同结构的新数据框中 Date应该是 20 行的第一个值 我尝试了这
  • WPF 中的 MVVM - 如何提醒 ViewModel 模型中的更改...还是应该?

    我正在阅读一些 MVVM 文章 主要是this and this 我的具体问题是 如何将模型更改从模型传递到视图模型 在乔什的文章中 我没有看到他这样做 ViewModel 总是向 Model 询问属性 在 Rachel 的例子中 她确实有
  • 使用单独的委托/数据源时的 UITableView 问题

    一般说明 首先 我有一个UITableView它已被放置到使用 Interface Builder 的 Xcode 生成的视图上 视图的文件所有者设置为 Xcode 生成的子类UIViewController 对于这个子类 我添加了以下工作
  • 如何在 Magento 2 中安装语言包?

    我尝试按照以下说明进行操作https mage2 pro t topic 270 and http devdocs magento com guides v2 0 config guide cli config cli subcommand
  • 放大动画

    我在用RotateAnimation对于图像 但我也想用动画放大图像 意味着当我的图像旋转时图像也 会缩放 如何使用旋转动画进行缩放 在 anim xml 中 您可以像这样使用比例
  • Windows 10 操作系统上的 Windows 窗体图形问题

    当我在 Windows 10 中运行任何 Windows 窗体应用程序时 窗口内的图形似乎扭曲 在设计时这不会发生 有人经历过这个吗 请打开图片以便看得更清楚 NET Framework gt 4 7 的更新答案 打开 app config
  • 当设备可以在应用程序级别强制使用深色主题时,如何避免在我的应用程序中强制使用深色主题?

    有些设备 例如Poco F2 Pro 可以在不兼容深色主题的应用程序中强制使用深色主题 例如 我的应用程序有这个主题 并且与深色主题不兼容
  • 在gdb中,如何将字符串写入内存?

    使用 gdb 将整数或十六进制写入内存地址非常简单 gdb set int 0x08040000 42 gdb set int 0x08040000 0xffffffff 但是我怎样才能以类似简单的方式将字符或整个字符串写入内存呢 现在我必
  • 如何使用反射将事件处理程序附加到事件?

    我知道关于EventInfo AddEventHandler 可用于将处理程序附加到事件的方法 但是 如果我什至无法定义事件处理程序的正确签名 例如 我什至没有引用处理程序所需的事件参数 该怎么办 我将用正确的代码解释问题 当我的解决方案中