.NET反射 二 动态创建对象
在某些情况下我们可能需要在运行的时候动态创建对象,或者动态确定需要调用那些方法,由于Type,Assembly封装了对象和程序集的信息,因此我们可以在运行时创建某个对象,某个程序集的Type,Assembly对象,接着利用他们提供的方法来实现动态创建对象,动态调用方法。
要获取某个对象的信息,动态创建某个类型的对象,首先要获取改类型的程序集,获取一个程序集的信息通常可以通过Assembly的静态方法来获取(Load,GetExecutingAssembly,GetAssembly,LoadForm,LoadFile),也可以通过AppDomian的静态方法来获取。接下来就是动态创建对象了。
1.创建构造函数无形参的对象
Assembly assembly = Assembly.GetExecutingAssembly();
//使用无参数的构造函数,如果要创建的类没有无参数的构造函数,则会引发异常
object obj = assembly.CreateInstance("ReflectionDemo.DemoClass", true); //这里要加命名空间
2.创建有形参的构造函数的对象
object[] parameters = new object[] { 1, 2 };
object obj2 = assembly.CreateInstance("ReflectionDemo.DemoClass", true, BindingFlags.Default, null, parameters, null, null);
Type typeObj = obj2.GetType();
//获取其所有成员并输出
MemberInfo[]members=typeObj.GetMembers();
foreach (MemberInfo item in members)
{
Console.WriteLine(item.Name);
Console.WriteLine(item.MemberType);
}
3.动态调用方法
共有方法要加对象实列
typeObj.InvokeMember("Print", BindingFlags.InvokeMethod,null,obj2,null);
静态方法不需要加对象实例
typeObj.InvokeMember("Print2",BindingFlags.InvokeMethod,null,null,null);