技术积累

明日复明日,明日何其多,我生待明日,万事成蹉跎。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.net的reflection (2)

Posted on 2005-07-03 21:37  追风逐云.NET  阅读(321)  评论(0编辑  收藏  举报
 一旦得到类对象,上表中所列的方法就能被叫来调用reflaction.第一个例子将检查在CSharpReflectionSamples.Reflect类中的得到方法的信息。第一块代码用来定义类中的每个方法的名字,第二块代码将阐述得到方法信息。向下面所展示的,我们将用一个数组来保存用GetMethod()方法返回的方法信息。MethodInfo类包含信息为方法的名字,不管是否是虚拟的,它都是可见的,等等。
  
  namespace CSharpReflectionSamples
  {
   using System;
   using System.Reflection;
  
   /// <summary>
   /// Summary description for Client.
   /// </summary>
   public class Client
   {
   public static void Main()
   {
   // the typeof operator and the GetType method
   // both return a 'Type' object.
   Type type1 = typeof(Reflect);
   Reflect objTest = new Reflect(0);
   Type type2 = objTest.GetType();
  
   Console.WriteLine("Type of objTest is {0}", type2);
   Console.WriteLine();
   // pause
   Console.ReadLine();
  
   // reflect method information
   MethodInfo[] minfo = type1.GetMethods();
   // iterate through methods
   foreach (MethodInfo m in minfo)
   {
   Console.WriteLine(m);
   }
   Console.WriteLine();
   }
   }
  }
  
  下一个例子将展示动态得到对象有可能接触的每个构造器的信息。类似与上面的例子,我们将返回一个包含每个构造器的信息ConstructorInfo对象。
  
  namespace CSharpReflectionSamples
  {
   using System;
   using System.Reflection;
  
   /// <summary>
   /// Summary description for Client.
   /// </summary>
   public class Client
   {
   public static void Main()
   {
   // the typeof operator and the GetType method
   // both return a 'Type' object.
   Type type1 = typeof(Reflect);
   Reflect objTest = new Reflect(0);
   Type type2 = objTest.GetType();
  
   Console.WriteLine("Type of objTest is {0}", type2);
   Console.WriteLine();
   // pause
   Console.ReadLine();
  
   // reflect constructors
   ConstructorInfo[] cinfo = type1.GetConstructors();
   // iterate through constructors
   foreach (ConstructorInfo c in cinfo)
   {
   Console.WriteLine(c);
   }
   }
   }
  }
  
  最后一部分,也许是reflection名字空间中最激动人心的部分,是在运行时动态调用类方法。有两种方法,首先,我们将建立一个数组来存储参数,这些参数被构造器用来建造对象。第二,一个System.Object对象将对抗CreateInstance方法的对象。以得到想得到对象的例子。最后,当我们有了对象的资料,我们能够调用任何使用MethodParm数组的方法。下面是代码:
  
  namespace CSharpReflectionSamples
  {
   using System;
   using System.Reflection;
  
   /// <summary>
   /// Summary description for Client.
   /// </summary>
   public class Client
   {
   public static void Main()
   {
   // the typeof operator and the GetType method
   // both return a 'Type' object.
   Type type1 = typeof(Reflect);
   Reflect objTest = new Reflect(0);
   Type type2 = objTest.GetType();
  
  
  
   // dynamic creation and invocation
   // instantiate the Reflect object, passing
   // a value of 1 to the constructor
   object[] oConstructParms = new object[] {1};
   object obj = Activator.CreateInstance(type1, oConstructParms);
   // invoke method of reflect object
   object[] oMethodParms = new object[] {17};
   int intResult = (int)type1.InvokeMember("AMethod", BindingFlags.Default |
   BindingFlags.InvokeMethod, null, obj, oMethodParms);
   Console.WriteLine("Result of calling AMethod on {0} is {1}",
   type1.Name, intResult);
   // pause
   Console.ReadLine();
   }
   }
  }
  
  
  这篇文章阐述了.net Reflaction的基础,在下一部分,我将和大家讨论进一步的话题,比如,动态发布中间语言,旗帜绑定,和中间语言原则。