如何在 .NET/C# 中通过反射引发事件?

2023-11-27

I have a third-party editor that basically comprises a textbox and a button (the DevExpress ButtonEdit control). I want to make a particular keystroke (Alt + Down) emulate clicking the button. In order to avoid writing this over and over, I want to make a generic KeyUp event handler that will raise the ButtonClick event. Unfortunately, there doesn't seem to be a method in the control that raises the ButtonClick event, so...

如何通过反射从外部函数引发事件?


这是使用泛型的演示(省略错误检查):

using System;
using System.Reflection;
static class Program {
  private class Sub {
    public event EventHandler<EventArgs> SomethingHappening;
  }
  internal static void Raise<TEventArgs>(this object source, string eventName, TEventArgs eventArgs) where TEventArgs : EventArgs
  {
    var eventDelegate = (MulticastDelegate)source.GetType().GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(source);
    if (eventDelegate != null)
    {
      foreach (var handler in eventDelegate.GetInvocationList())
      {
        handler.Method.Invoke(handler.Target, new object[] { source, eventArgs });
      }
    }
  }
  public static void Main()
  {
    var p = new Sub();
    p.Raise("SomethingHappening", EventArgs.Empty);
    p.SomethingHappening += (o, e) => Console.WriteLine("Foo!");
    p.Raise("SomethingHappening", EventArgs.Empty);
    p.SomethingHappening += (o, e) => Console.WriteLine("Bar!");
    p.Raise("SomethingHappening", EventArgs.Empty);
    Console.ReadLine();
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 .NET/C# 中通过反射引发事件? 的相关文章

随机推荐

  • 使用 msbuild 删除空目录

    如何递归处理路径 以便处理完成后路径下不存在空目录 例如 假设我们有C Dir1 Dir2 Dir3并且这些目录中都没有文件 结果应该是删除所有三个目录 我想在不使用自定义任务的情况下完成此任务 像这样的东西应该可以工作 但没有检查计算数千
  • 在自定义 UITableViewCell 中管理 UITextFields 的委托

    因此 我环顾四周 似乎没有任何内容可以准确解释执行此操作的正确方法 我在自定义 UITableViewCell 中有 7 个 UITextField 我的问题是 管理这些 UITextFields 委托的正确方法是什么 由于自定义单元格在技
  • PyCharm 不在主窗口上运行配置

    PyCharm 社区版在 Ubuntu 18 04 上如下所示 请注意 运行配置下拉列表不在我的主窗口上 搜索了文档 设置 视图 但无法弄清楚如何将其附加到主视图 还有其他人有这个问题吗 谢谢 LazyOne 你的回答让我注意到了导航栏 但
  • 如何使用淡入淡出动画设置屏幕亮度?

    是否可以在 iOS 5 1 上以动画方式显示屏幕亮度变化 我在用 UIScreen mainScreen setBrightness float 但我认为突然的改变很难看 当我尝试使用正在进行的先前动画将动画设置为另一个值时 我遇到了接受的
  • WooCommerce:如何显示“产品附加组件”扩展中的字段?

    我正在使用 WooCommerce 的 产品附加组件 1 扩展 它允许产品的自定义字段 这会自动显示在单个产品模板上 通过对单一产品模板的一些尝试和错误 它似乎挂在了某个地方woocommerce single product summar
  • 如何将本地时间字符串转换为 UTC?

    如何转换日期时间当地时间的字符串 to a UTC 时间字符串 我确信我以前做过这个 但找不到它 所以希望将来能帮助我 和其他人 做到这一点 澄清 例如 如果我有2008 09 17 14 02 00在我当地的时区 10 我想生成一个具有等
  • 是否可以检测移动浏览器的 GPS 位置? [复制]

    这个问题在这里已经有答案了 我正在制作一个针对手机的网站 并且希望在用户访问我的默认页面时获取用户当前的 GPS 纬度 经度 以便我可以向他们显示他们所在区域的结果 使用 ASP NET 可以实现这一点吗 See Also 从手机浏览器获取
  • 如何向 tableGrob 图添加标题?

    我有一个表格 我想在它上面打印一个标题 t1 lt tableGrob top 10 events by casualties cols c EVTYPE casualties rows seq 1 10 grid draw t1 这里也提
  • Spring和Hibernate突然将事务设置为只读

    我们有一个在 JBoss 4 2 3 上运行的应用程序 使用 Spring 2 5 2 和 Hibernate 3 2 6 ga 它在 Linux JEE01 2 6 16 60 0 54 5 smp 上运行 使用自己的用户 写入另一台机器
  • 在基于 Python 文本的 GUI (TUI) 中输入

    我一直在尝试在 python 2 7 中制作自己的基于文本的 UI 但我想到了一个关于输入的想法 所以我想到了这样的事情 input raw input input center 78 但粗略地说 光标在右侧很远 在我输入它之前才意识到它不
  • PHP CURL CURLOPT_SSL_VERIFYPEER 被忽略

    由于某种原因 我无法将 CURL 与 HTTPS 一起使用 一切都工作正常 直到我运行了curl 库的升级 现在 我在尝试执行 CURL 请求时遇到以下响应 SSL CA 证书有问题 路径 访问权限 根据此处发布的有关相关问题的建议 我尝试
  • 如何在 Eclipse IDE 中运行简单的 C 程序

    我已经下载了 Eclipse C C IDE 我需要在其中运行一个简单的c 程序 打印欢迎 在尝试运行该程序时 它会弹出一条错误消息 例如 Launch failed Binary not found 我需要安装任何编译器包 请帮助我做到这
  • 返回下载文件的 Post 请求

    我正在将数据发送到我的服务器 该服务器根据请求创建一个 pdf 文件 该文件创建得很好 但我无法将文件发送回客户端 我正在使用 React 来提交表单 handleSubmit event event preventDefault var
  • 没有形式参数的可变参数函数模板

    这就是我想做的 base case void f template
  • 使用 javascript 动态修改 SVG 过滤器

    我正在尝试创建动态模糊效果 可以使用 javascript 即时修改 首先 我使用这个非常简单的 svg 过滤器
  • 为什么我使用golang的mgo库找不到ID?

    我在 golang 中使用 mgo 库进行 mongodb 操作 这是我的代码 session SetMode mgo Monotonic true coll session DB aaaw web C cron emails var re
  • Matplotlib Colorbar 更改刻度标签和定位器

    我想更改下图颜色栏中的刻度线定位器和标签 import pandas as pd import matplotlib pyplot as plt from matplotlib import dates as mdates import n
  • 在 MVVM Light 中使用参数打开新窗口的最佳实践

    我对 mvvm 和 mvvm light 相当陌生 但我想我理解它的总体思路 我不明白的是 如果我想打开一个新窗口 但该窗口需要来自调用者的数据 将该数据获取到新窗口的最佳实践是什么 如果我将数据传递给构造函数 则意味着我需要后面的代码中的
  • 如何从托管代码中捕获的本机异常中获取本机堆栈跟踪

    我有一些托管代码调用一些本机 DLL 中的方法 我有适当的符号文件 有时 该本机方法会引发异常 我会在托管代码中捕获该异常 但是 当我从捕获的异常中打印堆栈跟踪时 我只看到托管代码 最后一帧是对本机代码的调用 但它看不到本机代码中的堆栈跟踪
  • 如何在 .NET/C# 中通过反射引发事件?

    I have a third party editor that basically comprises a textbox and a button the DevExpress ButtonEdit control I want to