反射和特性(3.动态创建和调用)
来源:互联网 发布:矩阵的谱分解 编辑:程序博客网 时间:2024/06/06 03:12
动态创建对象
在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它。可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以做什么。在进行更有趣的话题之前,我们先看下如何动态地创建一个对象。
我们新建一个控制台项目。然后,添加一个示范类,本文中将通过对这个示范类的操作来进行说明:
public class test { private int x; private int y; public test() { x = 0; y = 0; } public test(int x, int y) { this.x = x; this.y = y; } public int Add() { int total = 0; total = x + y; Console.WriteLine("Invoke Instance Method: "); Console.WriteLine(String.Format("[Add]: {0} plus {1} equals to {2}", x, y, total)); return total; } public static void Add(int x, int y) { int total = x + y; Console.WriteLine("Invoke Static Method: "); Console.WriteLine(String.Format("[Add]: {0} plus {1} equals to {2}", x, y, total)); } }
1.使用无参构造函数创建对象
Assembly asm = Assembly.GetExecutingAssembly();object obj1 = asm.CreateInstance("SimpleExplore.test", true);(obj1 as test).Add();
2.使用有参构造函数创建对象
Assembly asm = Assembly.GetExecutingAssembly();Object[] parameters = new Object[2]; parameters[0] = 3;parameters[1] = 5;object obj2 = asm.CreateInstance("SimpleExplore.test", true, BindingFlags.Default, null, parameters, null, null);(obj2 as test).Add();
动态调用方法
接下来我们看一下如何动态地调用方法。注意,本文讨论的调用不是将上面动态创建好的对象由Object类型转换成Calculator类型再进行方法调用,这和“常规调用”就没有区别了,让我们以.Net Reflection 的方式来进行方法的调用。
1.使用InvokeMember调用方法
Assembly asm= Assembly.GetExecutingAssembly();object obj1= asm.CreateInstance("SimpleExplore.test",true);object obj2= asm.CreateInstance("SimpleExplore.test",true,BindingFlags.Default,null,new object[]{3,5},null,null);Type t = typeof(test); t.InvokeMember("Add",BindingFlags.InvokeMethod,null,obj2,null);
调用静态方法:
Assembly asm= Assembly.GetExecutingAssembly();object obj1= asm.CreateInstance("SimpleExplore.test",true);object obj2= asm.CreateInstance("SimpleExplore.test",true,BindingFlags.Default,null,new object[]{3,5},null,null);Type t = typeof(test); t.InvokeMember("Add", BindingFlags.InvokeMethod, null, typeof(test), new object[] { 3, 5 });
2.使用MethodInfo.Invoke调用方法
Assembly asm= Assembly.GetExecutingAssembly();object obj1= asm.CreateInstance("SimpleExplore.test",true);object obj2= asm.CreateInstance("SimpleExplore.test",true,BindingFlags.Default,null,new object[]{3,5},null,null);Type t = typeof(test);//搜索public的实例成员 t.GetMethod("Add",BindingFlags.Instance|BindingFlags.Public).Invoke(obj2,null);
调用静态方法:
Assembly asm= Assembly.GetExecutingAssembly();object obj1= asm.CreateInstance("SimpleExplore.test",true);object obj2= asm.CreateInstance("SimpleExplore.test",true,BindingFlags.Default,null,new object[]{3,5},null,null);Type t = typeof(test);//搜索public的静态成员 t.GetMethod("Add",BindingFlags.Static|BindingFlags.Public).Invoke(obj2,null);
0 0
- 反射和特性(3.动态创建和调用)
- (16)反射、特性和动态编程
- 利用反射来动态创建实例和调用方法
- 利用反射来动态创建实例和调用方法
- 利用反射来动态创建实例和调用方法
- 利用反射来动态创建实例和调用方法
- 利用反射来动态创建实例和调用方法
- 第十七章 反射、特性和动态编程
- 反射和特性(1.反射基本信息)
- IOS开发反射和动态调用总结
- 反射和特性(2.反射特性信息)
- 定制特性和反射
- 24. 反射和特性
- C#反射和特性
- c# 反射和特性
- C# 特性和反射
- C#特性和反射
- 特性和反射
- Cassandra 数据模型
- springMVC--处理器适配器
- 未绑定host异常
- android studio 出现 Error running app: Instant Run requires 'Tools | Android | Enable ADB integration'
- Flex布局:实战
- 反射和特性(3.动态创建和调用)
- cocos creator学习笔记2017.2.10(二)
- spring注解的详解
- IOS项目自动生成技术文档
- hi~~~~~
- webview-键盘遮挡解决办法
- Android各种知识图(2):Activity和Fragment
- Java时间日期格式转换
- inux如何使用共享库的