【C#反射-動態建立物件】
阿新 • • 發佈:2019-02-03
上面部落格學習了使用反射檢視型別的資訊,以及使用反射獲取特性物件。
下面使用反射來動態建立物件。首先準備一個Test類:
1.使用無參建構函式建立物件: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; } }
2.使用有引數建構函式建立物件://使用無參建構函式建立物件 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(); //列印:這是一個無參建構函式
3.動態呼叫方法:使用InvokeMember呼叫方法//使用有參建構函式建立物件 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策略
//動態呼叫無引數方法
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);