C#编程 Reflection(反射)

        学习C#已有不长不短的一段时间了,反射对我来说一直是很神秘,让我敬而远之,开始做公司系统也有近三个月的时间了,从开始到公司熟悉业务,时逢缺人之季,没过几天就开始修改Bug,到后来做些小需求,做为一个刚毕业没啥经验的新人来说也不可能让我做什么太高深的东西,一直这么忙碌着,到现在系统一些很具体的东西也没有好好研究一下,不过近日任务较少就开始自己摸索着了解系统,居然遇到反射的问题,学习一下日后工作中难免用到,下面把自己理解的记下来备用……

          反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中另一个模块或都是Dll文件中的某一个类及类中成员,包括方法、属性、事件,以及构造函数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道

       在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: 
         System.Reflection命名空间
         (1)  AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器
         (2)  Assembly:程序集类

         (3)  Module:模块类
         (4)  Type:使用反射得到类型信息的最核心的类

       他们之间是一种从属关系,也就是说,一个AppDomain可以包含NAssembly,一个Assembly可以包含NModule,而一个Module可以包含NType. AppDomain这个类我们等下再来讲解。我们先关注Assembly个类,在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load,LoadFromLoadWithPartialName三个Assembly的静态方法.
       1. Load 方法:极力推荐的一种方法,Load 方法带有一个程序集标志并载入它,Load 将引起CLR把策略应用到程序集上,先后在全局程序集缓冲区,应用程序基目录和私有路径下面查找该程序集,如果找不到该程序集系统抛出异常  
       2. LoadFrom 方法:传递一个程序集文件的路径名(包括扩展名),CLR会载入您指定的这个程序集,传递的这个参数不能包含任何关于版本号的信息,区域性,和公钥信息,如果在指定路径找不到程序集抛出异常。  
       3. LoadWithPartialName:永远不要使用这个方法,因为应用程序不能确定再在载入的程序集的版本。该方法的唯一用途是帮助那些在.Net框架的测试环节使用.net 框架提供的某种行为的客户,这个方法将最终被抛弃不用。    
   注意:system.AppDomain 也提供了一种Load 方法,他和Assembly的静态Load 方法不一样,AppDomain的load 方法是一种实例方法,返回的是一个对程序集的引用,Assembly的静态Load 方发将程序集按值封装发回给发出调用的AppDomain.尽量避免使用

     如:

    如果在模块A中有一个窗体类

     public class FrmTest
  {

         public FrmTest()

         {         

         }     
     public viod FormInitMethod(string para1)

                 {

             //Do Something       

         }
  }

   在模块B中有类

   using System;
   using System.Reflection; 

  {
   class Class1
   {
       [STAThread]
       static void Main(string[] args)
        {

                             ReflectionExample();

        }

         Public void  ReflectionExample()

          {

                    String params="";

                     string DllName=“模块A的Dll路径''

                     string ClassName="反射的A模块的类名称FrmTest";

                      Assembly assembly = Assembly.LoadFrom(DllName);//加载程序集
                     Type fType = assembly.GetType(ClassName);  //获取当前的类型    

                     object instance = Activator.CreateInstance (fType);//创建此类型实例

                      fType.InvokeMember("FormInitMethod",BindingFlags.InvokeMethod,null,instance,Params);//Type类的一个                                                                                              //方法InvokeMember使用反射动态调用模块A中的类成员

          }
    }

}


   暂时写到先这里,略懂一二,有待更深入学习,今天写了第一篇文章,不管怎么样总之还是很高兴,加油……

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页