.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);

posted @ 2010-12-18 20:01  雁北飞  阅读(947)  评论(0编辑  收藏  举报