動態創建對象
在前面節中,我們先了解了反射,然後利用反射查看了類型信息,並學習瞭如何創建自定義特性,並利用反射來遍歷它。可以說,前面三節,我們學習的都是反射是什麼,在接下來的章節中,我們將學習反射可以做什麼。在進行更有趣的話題之前,我們先看下如何動態地創建一個對象。
我們新建一個控制檯項目。然後,添加一個示範類,本文中將通過對這個示範類的操作來進行說明:
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);