C# 反射调用私有事件
原文:C# 反射调用私有事件 在 C# 反射调用私有事件经常会不知道如何写,本文告诉大家如何调用 假设有 A 类的代码定义了一个私有的事件 通过反射可以拿到 A 的事件 Fx 但是无法直接添加事件 如果这时直接调用 AddEventHandler 就会出现下面异常 解决的方法是调用 GetAddMethod 的方法请看下面 参见 https://stackoverflow.com/a/6423886/6116637 如果可能遇到类型转换的异常 更多反射请看 .NET Core/Framework 创建委托以大幅度提高反射调用的性能 - walterlv 设置 .NET Native 运行时指令以支持反射(尤其适用于 UWP) - walterlv 本文会经常更新,请阅读原文:
class A
{
private event EventHandler Fx
{
add { }
remove { }
}
}
var eventInfo = typeof(A).GetEvent("Fx", BindingFlags.Instance | BindingFlags.NonPublic);
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:“由于不存在此事件的公共添加方法,因此无法添加该事件处理程序。”
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)
{
}
System.ArgumanetException:'Object of type 'System.EventHandler1[System.EventArgs]' cannot be converted to type 'System.EventHandler'.
,请看.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
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请
与我联系
。
最新文章
- BFC和haslayout
- bzoj 4610 Ceiling Functi
- workflow GetListIdByName 获取表名
- python数据挖掘领域工具包
- hdu 3506 Monkey Party 区间dp + 四边形不等式优化
- CAShapeLayer--备用
- Basic Concepts of Block Media Recovery
- ndk-stack 调试 android c++ 代码崩溃位置
- C++指针与const
- [Swift]LeetCode57. 插入区间 | Insert Interval
- Oracle伪列(ROWNUM)的使用
- Centos7.5 VMtools的安装与卸载
- 【打印】windows打印控件,Lodop.js介绍
- mybatis插入一个对象后获取表中自增的主键Id并且传入到插入的的对象中,方便将对象中其他属性赋值给其他以前表主键Id作为非空字段的表
- 使用Sqlserver事务发布实现数据同步(zhuanqian)
- Android实战技巧:如何在ScrollView中嵌套ListView
- create table repo_folder_operate_log_bak as select * from repo_folder_operate_log;
- sublime插件安装及常用插件配置
- fail2ban
- C语言 for循环次数
热门文章
- Java ThreadLocal Example(java中的ThreadLocal例子)
- Oracle中暂时表空间的清理
- 短网址ShortUrl的算法
- 每日技术总结:setInterval,setTimeout,文本溢出,小程序,wepy
- sbt教程
- Android中ImageView.ScaleType属性值
- Android多线程研究(9)——读写锁
- mysql 5.7 innodb count count(*) count(1) 大数据 查询慢 耗时多 优化
- MySQL数据库定时自动备份脚本
- java并发api总结