原文:2019-11-29-C#-反射调用私有事件

title author date CreateTime categories
C# 反射调用私有事件
lindexi
2019-11-29 08:51:13 +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

更多反射请看

win10 uwp 反射

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

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

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

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

2019-11-29-C#-反射调用私有事件的更多相关文章

  1. C# 反射调用私有事件

    原文:C# 反射调用私有事件 在 C# 反射调用私有事件经常会不知道如何写,本文告诉大家如何调用 假设有 A 类的代码定义了一个私有的事件 class A { private event EventH ...

  2. 2019-8-30-C#-反射调用私有事件

    title author date CreateTime categories C# 反射调用私有事件 lindexi 2019-08-30 08:52:57 +0800 2018-09-19 20: ...

  3. Java 反射 调用私有域和方法(setAccessible)

    Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...

  4. java反射调用私有方法和修改私有属性

    //调用私有方法package com.java.test; public class PrivateMethod { private String sayHello(String name) { r ...

  5. Java 反射 调用私有构造方法

    单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...

  6. 2019.11.29 Mysql的数据操作

    为名为name的表增加数据(插入所有字段) insert into name values(1,‘张三’,‘男’,20); 为名为name的表增加数据(插入部分字段) insert into name ...

  7. 2019.11.29 SAP SMTP郵件服務器配置 發送端 QQ郵箱

    今天群裏的小夥伴問了如何配置郵件的問題,隨自己在sap裏面配置了一個 1.    RZ10配置參數 a)       参数配置前,先导入激活版本 执行完毕后返回 b)      输入参数文件DEFAU ...

  8. pycharm+anaconda在Mac上的配置方法 2019.11.29

    内心os: 听人说,写blog是加分项,那他就不是浪费时间的事儿了呗 毕竟自己菜还是留下来东西来自己欣赏吧 Mac小电脑上进行python数据开发环境的配置 首先下载Anaconda,一个超好用的数据 ...

  9. Supervision meeting notes 2019/11/29

    topic 分支:  1. subgraph/subsequence mining Wang Jin, routine behavior/ motif. Philippe Fournier Viger ...

随机推荐

  1. ios 开发学习步骤

    https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/RoadMapiOSCh/Wher ...

  2. Vue实战狗尾草博客管理系统第一章

    Vue实战狗尾草博客后台管理系统第一章 这里准备采用的技术栈为:vue全家桶+element-ui 这里因为是后台管理系统,没有做SSR的必要.所以这里就采用前后端分离来昨晚这个项目~ 项目搭建 vu ...

  3. linux关闭ACPI电源管理模块

    一.运行环境 # cat /etc/redhat-release CentOS release 6.2 (Final) # uname -a Linux web-server- -.el6.x86_6 ...

  4. 1.编译chromium

    1. 前言 做了两年Chromium相关的开发,最近项目遇到瓶颈,自己有点迷茫.回顾之前做的工作,发现对chromium的认识还停留在非常表面的水平.因此,一直想对之前做的做个总结,只有总结反思才能提 ...

  5. linux 环境下 apache tomcat 安装jenkins

    参考文档: https://blog.51cto.com/12629984/1980034 https://www.cnblogs.com/lxs1314/p/8567652.html https:/ ...

  6. MAC自动化环境搭建

    UI自动化环境搭建 第一阶段:配置appium环境硬件配置mac系统电脑 java环境sunjiedeMacBook-Air:~ vicent$ java -versionjava version & ...

  7. Ansible 相关介绍

    相关视频http://v.xue.taobao.com/learn.htm?spm=a220o.1000855.0.0.24c748e6QMQV0e&courseId=111848 Ansib ...

  8. Sentinel Dashboard 的 Docker 镜像使用

    1.下载 docker 镜像:https://hub.docker.com/r/anjia0532/sentinel-docker 2.启动 docker 容器:docker run -p8080:8 ...

  9. thymeleaf关于js的一些坑

    乍一看,没问题,也许对应用过thymeleaf的小伙伴来说一眼就看出了问题,但是对于新手确实很难发现,thymeleaf会把[[]]中的内容作为内联取值块解析,而不是数组. 解决办法 方法一: < ...

  10. 并发、并行、同步、异步、全局解释锁GIL、同步锁Lock、死锁、递归锁、同步对象/条件、信号量、队列、生产者消费者、多进程模块、进程的调用、Process类、

    并发:是指系统具有处理多个任务/动作的能力. 并行:是指系统具有同时处理多个任务/动作的能力. 并行是并发的子集. 同步:当进程执行到一个IO(等待外部数据)的时候. 异步:当进程执行到一个IO不等到 ...