标签:
上面博客学习了使用反射查看类型的信息,以及使用反射获取特性对象。
下面使用反射来动态创建对象。首先准备一个Test类:
public class TestClass { public TestClass() { Console.WriteLine("这是一个无参构造函数"); } public TestClass(int a, int b) { Console.WriteLine("这是一个有参数构造函数 > a+b=" + (a + b)); } public int show() { return 1; } public static int show(int a,int b) { return a + b; } }1.使用无参构造函数创建对象:
//使用无参构造函数创建对象 Assembly asm = Assembly.GetExecutingAssembly();//获取当前代码所在程序集 Object obj = asm.CreateInstance("AssemblyDemo.TestClass", true);//创建一个对象TestClass对象 //打印:这是一个无参构造函数 ObjectHandle handler = Activator.CreateInstance(null, "AssemblyDemo.TestClass"); //CreateInstance 第一个参数为程序集名称,为null 表示当前程序集,第二个参数表示要创建的类型 Object obj1 = handler.Unwrap(); //打印:这是一个无参构造函数2.使用有参数构造函数创建对象:
//使用有参构造函数创建对象 Object [] param= new Object[2]; param[0]=1; param[1]=2; Assembly asm2 = Assembly.GetExecutingAssembly(); Object obj2 = asm2.CreateInstance("AssemblyDemo.TestClass", true, BindingFlags.Default, null, param ,null,null); //BindingFlag是限定对类型成员的搜索,这里Default不使用BindingFlags策略3.动态调用方法:使用InvokeMember调用方法
//动态调用无参数方法 Type t = typeof(TestClass); TestClass ts=new TestClass (1,2); int result = (int)t.InvokeMember("show", BindingFlags.InvokeMethod,null,ts,null); Console.WriteLine(result);
//动态调用有参静态方法 Type t1 = typeof(TestClass); int result1 = (int)t1.InvokeMember("show",BindingFlags.InvokeMethod,null,t1,param); Console.WriteLine(result1);4.使用MethodInfo.Invoke调用方法:
//使用MethodInfo.Invoke调用方法 Type t2 = typeof(TestClass); TestClass ts2 = new TestClass(); MethodInfo mi = t2.GetMethod("show",BindingFlags.Instance|BindingFlags.Public); int result2=(int)mi.Invoke(ts2, null); Console.WriteLine(result2); Type t3 = typeof(TestClass); MethodInfo mi1 = t3.GetMethod("show",BindingFlags.Static|BindingFlags.Public); int result3 = (int)mi1.Invoke(null, param); Console.WriteLine(result3);
标签:
原文地址:http://blog.csdn.net/heyangyi_19940703/article/details/51346357