2019-8-30-C#-反射调用私有事件
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
C# 反射调用私有事件
|
lindexi
|
2019-08-30 08:52:57 +0800
|
2018-09-19 20:44:19 +0800
|
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
更多反射请看
.NET Core/Framework 创建委托以大幅度提高反射调用的性能 - walterlv
设置 .NET Native 运行时指令以支持反射(尤其适用于 UWP) - walterlv
2019-8-30-C#-反射调用私有事件的更多相关文章
- C# 反射调用私有事件
原文:C# 反射调用私有事件 在 C# 反射调用私有事件经常会不知道如何写,本文告诉大家如何调用 假设有 A 类的代码定义了一个私有的事件 class A { private event EventH ...
- 2019-11-29-C#-反射调用私有事件
原文:2019-11-29-C#-反射调用私有事件 title author date CreateTime categories C# 反射调用私有事件 lindexi 2019-11-29 08: ...
- Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...
- java反射调用私有方法和修改私有属性
//调用私有方法package com.java.test; public class PrivateMethod { private String sayHello(String name) { r ...
- Java 反射 调用私有构造方法
单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...
- .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)——转载
原文链接:https://blog.walterlv.com/post/dotnet-high-performance-reflection-suggestions.html ***** 大家都说反射 ...
- 原 .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以 ...
- 从vs2010的UnitTestFramework类库提取私有方法反射调用的方法
背景 年龄大点的程序员都知道在vs2010中创建单元测试非常的简单,鼠标定位在方法名字,右键创建单元测试,就会创建一个测试方法,即使是在私有方法上也可以创建测试方法. VS2010以后就没这么简单了, ...
- 利用反射--调用一个按钮的Click事件
最基本的调用方法 (1)button1.PerformClick();(2)button1_Click(null,null);(3)button_Click(null,new EventArgs()) ...
随机推荐
- 学习es6
#第一节 初始化项目 npm init -y 安装babel-cli npm install -g babel-cli npm install --save-dev babel-preset-es20 ...
- 2018-3-4-dotnet-设计规范-·-结构体定义
title author date CreateTime categories dotnet 设计规范 · 结构体定义 lindexi 2018-03-04 17:48:44 +0800 2018-2 ...
- Python subn函数
- linux系统命令配置文件
系统命令要独占地控制系统,并让一切正常工作.所有如 login(完成控制台用户身份验证阶段)或 bash(提供用户和计算机之间交互)之类的程序都是系统命令.因此,和它们有关的文件也特别重要.这一类别中 ...
- JS黑科技
1.论如何优雅的取随机字符串 Math.random().toString(16).substring(2) // 13位 Math.random().toString(36).substring(2 ...
- 用Java来获取访问者真实的IP地址
用Java来获取访问者真实的IP地址 转载 2016年06月07日 14:36:02 标签: 16497 编辑 删除 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAdd ...
- jQuery左右循环滚动图片特效
在线演示 本地下载
- parkingLot
一个支付宝停车支付生活号前端页面 //index.html //自定义键盘 <!DOCTYPE html> <html> <head> <meta chars ...
- TensorFlow3学习笔记1
1.简单实例:向量相加 下面我们通过两个向量相加的简单例子来看一下Tensorflow的基本用法. [1. 1. 1. 1.] + [2. 2. 2. 2.] = [3. 3. 3. 3.] impo ...
- Pycurl介绍
pycurl — A Python interface to the cURL library Pycurl包是一个libcurl的Python接口.pycurl已经成功的在Python2.2到Pyt ...