动态创建对象
在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它。可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以做什么。在进行更有趣的话题之前,我们先看下如何动态地创建一个对象。
我们新建一个控制台项目。然后,添加一个示范类,本文中将通过对这个示范类的操作来进行说明:
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);