C#方法中的反射方式和委托方式(小实例)
在开发过程中对静态方法的调用是通过类型名后面加个点而后是调用方法的名称,对类型实例方法的调用是通过new一个对象,而后点加方法名称,这是最熟悉不过的两种方式。还可以通过读取CLR元数据,利用反射进行方法调用。在利用反射方式调用方法时,最重要的两个类是System.Type和System.Reflection.MethodInfo。用MethodInfo类型的Invoke方法调用方法,必须传入目标对象实例的引用。如下:
public class Calculate {private int Add(int leftNum, int rightNum) {return leftNum + rightNum; }protected string Hello(string name) {return "你好:" + name; } }
委托方式
任何对象都可以调用委托,只要方法返回值以及方法签名和委托声明一样就行。
public delegate int DelegateCaculate(int a,int b);public class Calculatetest {public int Add(int num1, int num2) {return num1+num2; }public static int Subtract(int num1,int num2) {return num2 - num1; } }
控制台调用:
class Program {static void Main(string[] args) {//用type.getmethod的方法获取类型方法,BindingFlags设置查找方法的范围//本列是公有方法,私有方法而且是非静态的才被查找,如果要查找静态方法//需要设置BindingFlags.Static System.Reflection.MethodInfo method = typeof(Calculate).GetMethod("Add", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);if (method == null)return;//调用方法的参数 object[] paras = { 10, 20 };//目标对象实例:new Calculate() object result = method.Invoke(new Calculate(), paras); Console.WriteLine(result); System.Reflection.MethodInfo mt = typeof(Calculate).GetMethod("Hello", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);if (mt == null)return;//调用方法的参数 object[] para = { "李光辉" };object rs = mt.Invoke(new Calculate(), para); Console.WriteLine(rs); Console.ReadLine(); //委托的调用 DelegateCaculate add = new DelegateCaculate(new Calculatetest().Add); DelegateCaculate subtract = new DelegateCaculate(Calculatetest.Subtract); Console.WriteLine("add:" + add(10, 20)); Console.WriteLine("subtract:" + subtract(10, 20)); Console.ReadLine(); } }
委托与接口
接口与委托都拥有调用特定方法的能力,所以他们在这点很相像。但是接口需要目标方法的类型声明必须与该接口兼容,而委托可以被任何类型调用,只要该类型的目标方法签名和委托签名匹配即可。
那么何时用委托,何时用接口呢,msdn 总结的非常好,我就直接给粘贴过来了,
委托在以下情况很有用:
1、 调用单个方法。
2、 一个类希望有方法规范的多个实现。
3、 希望允许静态方法实现规范。
4、 希望类似事件的设计模式。
5、 调用方不需要知道或获得实现与委托签名匹配的方法的对象。
6、 实现的提供程序希望只对少数选择组件“分发”规范实现。
7、 需要方法的组合。
接口在以下情况很有用:
1、 规范定义一组相关方法。
2、 类通常只实现规范一次。
3、 接口的调用方希望转换为接口类型或从接口类型转换,以获得其他接口或类。
1 private void callObjectEvent(Object obj, string EventName) 2 { 3 //建立一个类型,AssemblyQualifiedName拿出有效的名字 4 Type t = Type.GetType(obj.GetType().AssemblyQualifiedName); 5 //参数对象 6 object[] p = new object[1]; 7 //产生方法 8 MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance); 9 //参数赋值。传入函数 10 //获得参数资料 11 ParameterInfo[] para = m.GetParameters(); 12 //根据参数的名字,拿参数的空值。 13 p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty"); 14 //调用 15 m.Invoke(obj, p); 16 return; 17 } 18 19 //调用例子。 20 //调用Button1的onclick 21 callObjectEvent(Button1,"OnClick"); 22 23 //调用Button5的OnKeyPress 24 callObjectEvent(Button5,"OnKeyPress"); 25 26 //调用Text1的OnTextChanged 27 callObjectEvent(Text1, "OnTextChanged");
private void callObjectEvent(Object obj, string EventName, EventArgs e=null) { //建立一个类型 //Type t = typeof(obj.GetType); Type t = Type.GetType(obj.GetType().AssemblyQualifiedName); //产生方法 MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance); //参数赋值。传入函数 //获得参数资料 ParameterInfo[] para = m.GetParameters(); //根据参数的名字,拿参数的空值。 //参数对象 object[] p = new object[1]; if (e == null) p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty"); else p[0] = e; //调用 m.Invoke(obj, p); return; } //调用例子。 //调用Button1的onclick callObjectEvent(Button1,"OnClick"); //调用Button5的OnKeyPress callObjectEvent(Button5,"OnKeyPress"); //调用Text1的OnTextChanged callObjectEvent(Text1, "OnTextChanged"); //调用Form的KeyPress事件, this就是那个winform, 并且传入回车键 callObjectEvent(this, "OnKeyPress", new KeyPressEventArgs((char)13));
转载于:https://www.cnblogs.com/liguanghui/archive/2011/12/01/2270761.html
C#方法中的反射方式和委托方式(小实例)相关推荐
- 再议C#方法中的反射方式和委托方式
再议C#方法中的反射方式和委托方式 我们将要谈到的是C#方法中的反射方式和委托方式,文中还将给出具体代码,以方便大家测试和实践. AD: 在开发过程中对静态方法的调用是通过类型名后面加个点而后是调用方 ...
- android 之自定义适配器(重写的getView()方法中convertView元素的妙用)一个实例
实现效果: 主要还是ListView的优化: 基本思路: <1>使用自定义适配器完成操作 <2>将listView进行优化处理 /* //ListView完成了重用条目的优化 ...
- Java中的反射的应用
在正常情况下,需要先有一个类的完整路径引入之后才可以按照固定的格式产生实例话对象,但是在Java中也允许通过一个实例话对象找到一个类的完整信息.那么这就是Class类的功能. 实际上类是Java反射的 ...
- java 父类this_java父类方法中使用this,可以把this强转为子类对象,然后调用子类的实例方法,怎么解释?...
1.代码如下 父类代码: public class A { public void a(){ B b=(B)this; System.out.println(b.getNum()); System.o ...
- 枚举转中文,通过反射方法与描述的方式获取
示例: 有人为了显示中文,这样定义枚举吗? publicenum TimeOfDay { 上午, 下午, 晚上 }; 这样定义,很别扭,特别是在使用的时候, 比如,this.Time = TimeOf ...
- java 反射 main_java – 通过反射访问main方法中的局部变量
Since main is static, is it possible to access instanceOfB in order to access the value of _nonStati ...
- 深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用
反射的概念 反射:Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性 通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活成 ...
- 【反射机制】Java中的反射机制,使用反射机制创建对象、访问属性、方法、构造方法等
这篇文章主要是整理了Java中的反射机制,包括:反射机制概念.反射机制访问构造方法.反射机制访问普通方法.反射机制访问属性,反射机制访问修饰符. 目录 一.反射机制概念 二.反射机制使用 (1)加载C ...
- 反射方式调用enum的方法
代码中存在很多结构相似的枚举,需要分别调用其方法名称相同的方法,所以选择使用反射调用 枚举代码如下: package com.ruisitech.bi.enums.bireport;/*** @aut ...
最新文章
- 【力扣网练习题】罗马数字转整数
- gazebo入门_【ROS-Gazebo】仿真插件编写教程(1)——概述
- 运维大数据可视化分析平台来了,枯燥运维数据也可以生动起来
- python echarts mysql python_Django中从mysql数据库中获取数据传到echarts方式
- Spring AOP / AspectJ AOP 的区别?
- mysql 实时性能_Mysql 实时查看性能
- php通过smtp发送邮件源码_PHP SMTP发送邮件函数
- 如何使用recordMyDesktop录制截屏视频
- 前端每日实战:33# 视频演示如何用纯 CSS 创作牛奶文字变换效果
- C# dataTable实用例
- Python 脚本查询 ip纯真数据库
- solidworks图纸模板添加_solidworks工程图模板制作(大全).doc
- 超全GitLab保姆级使用教程
- 使用金蝶云星空(以前叫:金蝶K3 CLOUD)后,感觉像踩进了一个坑
- c语言pow函数原型_C语言pow函数
- 程序运行所花费的时间如何计算
- 重装系统ie无法解析服务器名称,教你解决ie浏览器打不开的方法
- 光遇测试服要用什么更新软件,光遇测试服最新版
- 工作多年,对程序员“未来”的一些看法
- easypoi导出一对多,合并单元格,且根据内容自适应行高