刚开始看到这个标题的时候其实我也是很难接受的,duang~因为实在想不出什么时候我要去这样子创建对象,干嘛不new一个呢?但根据学习设计模式的经验来说,有时候,不去new对象才是最灵活的做法。
首先,写个小类拿着玩儿:
public class Calculator
{
private int x;
private int y;
public Calculator() {
x = 0;
y = 0;
Console.WriteLine("Calculator () invoked");
}
public Calculator(int x, int y) {
this.x = x;
this.y = y;
Console.WriteLine("calculator(int x, int y) invoked");
}
}
接下来,我们就在同一个assembly里面,针对这个类的有参数的构造方法和无参数的构造方法进行动态创建对象。
其实感觉动态创建对象跟type还是有莫大关系的。
#region 使用无参数的构造函数创建对象(Assembly的CreateInstance)
//Assembly asm = Assembly.GetExecutingAssembly();
// Calculator cal = asm.CreateInstance("动态创建对象.Calculator", true) as Calculator;
#endregion
#region 使用无参数的构造函数创建对象([using System.Runtime.Remoting;]使用Activator)
//ObjectHandle handler = Activator.CreateInstance(null, "动态创建对象.Calculator");
//Calculator cal = handler.Unwrap() as Calculator;
#endregion
在使用有参数的构造函数进行创建的时候,其实就是指定的参数多一点:
#region 使用有参数的构造函数创建对象
Assembly asm = Assembly.GetExecutingAssembly();
object[] parameters = new object[2];
parameters[0] = 3;
parameters[1] = 3;
Calculator cal = asm.CreateInstance("动态创建对象.Calculator", true, BindingFlags.Default, null, parameters, null, null) as Calculator;
#endregion
比较重要的参数:
object[],包含传递进去的构造函数参数,注意数组顺序要跟构造函数中顺序一致;
利用强大的反射,创建起来还是蛮容易的。。。