使用反射来指定委托的类型(附加到事件)?

2023-12-09

我实际上想做的是这样的(我意识到这不是有效的代码):

// Attach the event.
try
{
    EventInfo e = mappings[name];
    (e.EventHandlerType) handler = (sender, raw) =>
    {
        AutoWrapEventArgs args = raw as AutoWrapEventArgs;
        func.Call(this, args.GetParameters());
    };

    e.AddEventHandler(this, handler);
}
...

现在我知道 e.EventHandlerType 将始终derive来自事件处理程序。但是,我不能只是这样做:

    EventHandler<AutoWrapEventArgs> handler = (sender, raw) =>
    {
        AutoWrapEventArgs args = raw as AutoWrapEventArgs;
        func.Call(this, args.GetParameters());
    };

    e.AddEventHandler(this, handler);

正如 .NET 抱怨的那样,当调用 AddEventHandler 时,没有适用于从 EventHandler 到 EventHandler 的转换。这是确切的消息:

Object of type 'System.EventHandler`1[IronJS.AutoWrapObject+AutoWrapEventArgs]'
cannot be converted to type
'System.EventHandler`1[Node.net.Modules.Streams.NodeStream+DataEventArgs]'.

我还尝试使用 Invoke 动态使用 e.EventHandlerType 的构造函数,但无法将委托定义传递到 Invoke() 的参数列表(因为没有从委托到对象的转换)。

有什么办法我可以使用反射解决这个问题?


答对了!技巧是获取委托类型的构造函数的引用,然后使用以下参数调用它:

  • 委托的目标对象(backend.Target)
  • 委托的指针 (backend.Method.MethodHandle.GetFunctionPointer())

执行此操作的实际代码如下所示(本例中的 t 是继承期间提供给 EventHandler 的通用参数):

Type t = e.EventHandler.GetGenericArguments()[0];
Delegate handler = (Delegate)
    typeof(EventHandler<>)
    .MakeGenericType(t)
    .GetConstructors()[0]
    .Invoke(new object[]
        {
            backend.Target,
            backend.Method.MethodHandle.GetFunctionPointer()
        });

然后,您可以使用委托来添加事件,如下所示:

e.AddEventHandler(this, handler);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用反射来指定委托的类型(附加到事件)? 的相关文章

随机推荐

  • 如何便携式地打开大文件支持?

    我目前正在编写一个 C 程序 该程序可以读取和写入大小可能超过 2 GiB 的文件 在Linux上功能测试宏 7 规定 LARGEFILE64 SOURCE Expose definitions for the alternative AP
  • 如何使用 REST API 下载 Parse.com 文件类型?

    Parse com REST API 文档列出了与 Parse com 数据交互的多种方式 例如上传和下载类 它还描述了上传文件 但它没有提到如何从 Parse com 下载文件 有谁知道这是否可能 如果可以 该怎么做 Parse com
  • WCF 耐用服务是正确的选择吗?

    我们正在选择在 WCF 会话 调用之间保存状态的最佳方法 我们发现WCF耐用服务适合我们的需要 我们想知道这对于大量使用是否可以 我们预计有 1000 多个会话 每个会话将保存大约 100KB 的数据 xml 序列化格式 并保存复杂的对象
  • 使用延迟形状数组从 C 调用 Fortran

    是否可以从 C C 调用 Fortran 子例程 其中 Fortran 参数之一是延迟形状数组 希望我正确使用了术语 延迟形状 在下面的例子中 subr1 使用显式形状 并且工作正常 但是subr2 使用延迟形状并导致段错误 这个问题表示需
  • 如何将 PHP 数组表示为逗号分隔的字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 PHP MYSQL 在 WHERE 子句中使用数组 我有一个 ID 值为 1 5 2 6 7 的数组 我需要在 MySQL item id IN 1 5 2 6 7 语句中使用它来仅选择具有数组中列出
  • “this”是否指的是调用此函数的元素?

    在下面的代码片段中我使用 this 引用调用该函数的元素 我知道这是不正确的 因为我打印了这些值 它给了我 未定义 如何引用输入元素 function datepicker datepicker onSelect function date
  • 如何像“netstat -p”一样但更快?

    netstat p 和 lsof n i P 似乎都读取链接所有进程 fd 例如stat proc fd 怎样做才能更有效率呢 我的程序想知道哪个进程正在连接到它 一次又一次地遍历所有流程似乎效率太低 建议 iptables 或内核补丁的方
  • 引导网格与折叠容器之间

    这是我的第一个问题 我希望你能帮助我 我正在尝试使用引导网格设置产品概述页面 我已经连续购买了 4 款大屏幕产品 对于较小的屏幕尺寸 我希望每行有 2 个产品 诀窍是 我想将产品详细信息放在行之间的折叠容器中 当我单击产品时 该容器会打开
  • 多处理打印语句在 Spyder IDE 中不起作用

    在运行 Windows Server 2012 R2 的计算机上 在 Anaconda 的 Spyder IDE 中并使用以下代码运行 Python 3 7 import time import multiprocessing start
  • 使用 pyqtgraph 绘图而不显示

    我正在尝试从 matplotlib 转向使用 pyqtgraph 进行绘图 因为它具有更快地渲染和保存图像的能力 当我尝试在具有多处理器的集群上执行此操作时 我遇到了以下问题 QStandardPaths XDG RUNTIME DIR未设
  • 在 Android 上设置 MonkeyRunner

    我想使用 MonkeyRunner 我有一个 Monkeyrunner jar 并将其导入到我的项目中 我现在该如何使用它 你能告诉我我应该一步一步做什么吗 我在 python 上看到了一些代码片段 但我不明白如何在 eclipse 中使用
  • 无法使用spark从s3存储桶读取

    val spark SparkSession builder appName try1 master local getOrCreate val df spark read json s3n BUCKET NAME FOLDER FILE
  • iOS 7 更改 UINavigationBar titleView alpha

    所以我使用iOS7的UINavigationBar组件 而不是UINavigationController本身 当我使用自定义导航控制器推送新视图时 我想将标题的 alpha 更改为 0 0 然后再更改回来 但我似乎无法让它工作 我正在尝试
  • Android 以编程方式向应用程序添加小部件警告消息

    我创建了一个测试 Android 启动器应用程序 并将其作为系统应用程序安装在已 root 的设备上 该应用程序的目标是将所有已安装的小部件放置在视图页面的片段上 这已经成功完成 但是 每次显示新页面时都会向用户显示一条消息 即使用户选中该
  • 日历班级时间月份不匹配

    Calendar c Calendar getInstance System out println Mili gt gt c getTimeInMillis System out println Month gt gt Calendar
  • 是否可以重置 ServicePointManager?

    我正在尝试遵循类似于给出的代码System Net Mail SMTPClient如何进行本地IP绑定我在具有多个 IP 地址的计算机上使用 Windows 7 和 Net 4 0 我有绑定IPEndPointDelegate定义的 pri
  • Android Realm - 从服务访问 Realm 对象

    我有一个在我的活动中创建的领域对象 我需要能够在我创建的服务中访问该对象 但是 我在服务中创建 Realm 对象时收到错误 mRealm Realm getInstance getApplicationContext java lang I
  • 从 zip 文件中提取文件并保留 mod 日期?

    我正在尝试使用 Python 2 7 1 在 Windows 上 仅供参考 从 zip 文件中提取文件 并且我的每次尝试都显示提取的文件的修改日期 提取时间 这是不正确的 import os zipfile outDirectory C T
  • 从 APK 安装应用程序时出现 java.lang.ClassNotFoundException [重复]

    这个问题在这里已经有答案了 我在下面描述的错误发生在以下情况 直接通过 APK 在设备上安装应用程序 通过 Play 商店下载应用程序 在以下情况下不会发生该错误 通过 Eclipse 安装 apk 按下 运行 按钮 java lang R
  • 使用反射来指定委托的类型(附加到事件)?

    我实际上想做的是这样的 我意识到这不是有效的代码 Attach the event try EventInfo e mappings name e EventHandlerType handler sender raw gt AutoWra