原文:C# 反射调用私有事件

在 C# 反射调用私有事件经常会不知道如何写,本文告诉大家如何调用

假设有 A 类的代码定义了一个私有的事件

    class A
{
private event EventHandler Fx
{
add { }
remove { }
}
}

通过反射可以拿到 A 的事件 Fx 但是无法直接添加事件

            var eventInfo = typeof(A).GetEvent("Fx", BindingFlags.Instance | BindingFlags.NonPublic);

如果这时直接调用 AddEventHandler 就会出现下面异常

            var eventInfo = typeof(A).GetEvent("Fx", BindingFlags.Instance | BindingFlags.NonPublic);

            var a = new A();

            eventInfo.AddEventHandler(a, new EventHandler(Fx));

            void Fx(object sender, EventArgs e)
{
}
System.InvalidOperationException:“由于不存在此事件的公共添加方法,因此无法添加该事件处理程序。”

解决的方法是调用 GetAddMethod 的方法请看下面

            var eventInfo = typeof(A).GetEvent("Fx", BindingFlags.Instance | BindingFlags.NonPublic);
var addFx = eventInfo.GetAddMethod(true);
var removeFx = eventInfo.GetRemoveMethod(true); var a = new A(); addFx.Invoke(a, new[] {new EventHandler(Fx)});
removeFx.Invoke(a, new[] {new EventHandler(Fx)}); void Fx(object sender, EventArgs e)
{
}

参见 https://stackoverflow.com/a/6423886/6116637

如果可能遇到类型转换的异常System.ArgumanetException:'Object of type 'System.EventHandler1[System.EventArgs]' cannot be converted to type 'System.EventHandler'. ,请看.NET/C# 使用反射注册事件 - walterlv

更多反射请看

win10 uwp 反射

.NET Core/Framework 创建委托以大幅度提高反射调用的性能 - walterlv

设置 .NET Native 运行时指令以支持反射(尤其适用于 UWP) - walterlv

.NET/C# 使用反射调用含 ref 或 out 参数的方法 - walterlv

.NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法) - walterlv


本文会经常更新,请阅读原文:
https://lindexi.gitee.io/lindexi/post/C-%E5%8F%8D%E5%B0%84%E8%B0%83%E7%94%A8%E7%A7%81%E6%9C%89%E4%BA%8B%E4%BB%B6.html
,以避免陈旧错误知识的误导,同时有更好的阅读体验。


本作品采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:
https://lindexi.gitee.io
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请
与我联系

最新文章

  1. BFC和haslayout
  2. bzoj 4610 Ceiling Functi
  3. workflow GetListIdByName 获取表名
  4. python数据挖掘领域工具包
  5. hdu 3506 Monkey Party 区间dp + 四边形不等式优化
  6. CAShapeLayer--备用
  7. Basic Concepts of Block Media Recovery
  8. ndk-stack 调试 android c++ 代码崩溃位置
  9. C++指针与const
  10. [Swift]LeetCode57. 插入区间 | Insert Interval
  11. Oracle伪列(ROWNUM)的使用
  12. Centos7.5 VMtools的安装与卸载
  13. 【打印】windows打印控件,Lodop.js介绍
  14. mybatis插入一个对象后获取表中自增的主键Id并且传入到插入的的对象中,方便将对象中其他属性赋值给其他以前表主键Id作为非空字段的表
  15. 使用Sqlserver事务发布实现数据同步(zhuanqian)
  16. Android实战技巧:如何在ScrollView中嵌套ListView
  17. create table repo_folder_operate_log_bak as select * from repo_folder_operate_log;
  18. sublime插件安装及常用插件配置
  19. fail2ban
  20. C语言 for循环次数

热门文章

  1. Java ThreadLocal Example(java中的ThreadLocal例子)
  2. Oracle中暂时表空间的清理
  3. 短网址ShortUrl的算法
  4. 每日技术总结:setInterval,setTimeout,文本溢出,小程序,wepy
  5. sbt教程
  6. Android中ImageView.ScaleType属性值
  7. Android多线程研究(9)——读写锁
  8. mysql 5.7 innodb count count(*) count(1) 大数据 查询慢 耗时多 优化
  9. MySQL数据库定时自动备份脚本
  10. java并发api总结