zoukankan      html  css  js  c++  java
  • 反射

           反射就是程序运行时,获取运行的类型信息。通俗的说,就是程序运行时,获取程序所用的类,dll文件等信息从而调用类,dll文件中的属性和方法。(不过也有一点点疑惑,反射的功能貌似用其他的方式也能实现,为啥要用反射。。。)

           下面的示例程序利用NET框架的三个内置类来使用反射:System.Reflection.Assembly,System.Type,和System.Activator      

          System.Reflection.Assembly类描述了.NET的程序集.在.NET中,程序集是配置单元.对于一个典型的Windows程序,程序集被配置为单一的Win32可执行文件,并且带有特定的附加信息,使之适应.NET运行环境.程序集也可以配置为Win32的DLL(动态链接库),同样需要带有.NET需要的附加信息.System.Reflection.Assembly类可以在运行的时候取得程序集的信息.这些信息包括程序集包含的类型信息.

      System.Type类描述了类型定义.一个类型声明可以是一个类,接口,数组,结构体,或者枚举.在加载了一个类之后,System.Type类可以被用于枚举该类支持的方法,属性,事件和接口.

       System.Activator类用于创建一个类的实例.

          

    例如要获取程序中调用的类的文件信息:

           eg :

             //义一个接口CalMoney

            interface CalMoney

           {                 

               double getmoney()

            }

           //义一个类class1继承于接口 CalMoney,里面包含两个属性Name和Money,一个方法getmoney()      

            struct class1 : CalMoney      

           {

                public class1(string s)
                {
                }

                 string Name

                 double Money

                 double getmoney(string Number)

                 {...}

           }

    1、获取class1的type,三种方式(一般要加上命名空间,用Namespace.class1)

           Type t = class1.GetType();     //

           Type t = Type.GetType("class1")   //Type t = Type.GetType("Namespace.class1")

           Type t = Assembly.GetType("class1")  //Type t = Assembly.GetType("Namespace.class1") 

        ------------------------------------------------------------------------------------------------------------------------------ 

        //如果是获取dll文件信息,可以采用以下方式:

        System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFile(@"d:\Class1.dll");   //建立dll工程,工程文件里为class1,路径放在D盘下
        Type t = ass.GetType("Namespace.class1");//必须使用名称空间+类名称

       ------------------------------------------------------------------------------------------------------------------------------ 

     

    2、获取class1内部成员的信息

           //获取类型的结构信息

         constructorinfo[] myconstructors=t.GetConstructors;

         //获取类型的字段信息

         fieldinfo[] myfields=t.GetFiedls()

         //获取方法信息

         MethodInfo myMethodInfo=t.GetMethods();

         //获取属性信息

         propertyInfo[] myproperties=t.GetProperties

         //获取事件信息

         EventInfo[] Myevents=t.GetEvents;

    3、调用class1内部的方法

        3.1 已知class1中的内部方法

             //构造器的参数
            object[] constuctParms = new object[]{"ZhangFei"};
            //根据类型创建对象
            object dObj = Activator.CreateInstance(t,constuctParms);
            //获取方法的信息
            MethodInfo method = t.GetMethod("getmoney");
            //调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
            BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
            //gemoney方法的参数
            object[] parameters = new object[]{"100101"};
            //调用方法,用一个object接收返回值
            object returnValue = method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);

           属性与方法的调用大同小异,大家也可以参考MSDN

       

         3.2 判断class1中继承的接口(通过接口可以判断class1实现哪些方法) 

             if( t.GetInterface(“ CalMoney ”) !=null )
             {

                  //通过接口调用函数

                   CalMoney CM=(CalMoney)System.Activator.CreateInstance(t); 

                   CM.getmoney();

             }
            

     本文参考

    http://zhangxuming.blog.51cto.com/1762/89529   入门

    http://www.cnblogs.com/whxleem/articles/16895.html    入门

    http://www.cnblogs.com/whxleem/articles/16896.html    实例

    http://www.cnblogs.com/whxleem/articles/23800.html    实例

    http://www.cnblogs.com/fineboy/archive/2006/10/10/525348.html   实例

  • 相关阅读:
    深度剖析Byteart Retail案例
    REVIT使用中遇到的各种问题汇总
    常用设计规范
    编程修养
    Linux、Windows静态编译ffmpeg 4.4.1、x264、x265等编解码库的脚本
    程序员的灯下黑:重知识轻技术
    GitHub 公布 2021 Top 10 博文「GitHub 热点速览」
    狠人!标星 3.4 万的项目说删就删,几行代码搞崩数万个开源项目
    重装系统前备份fstab
    Ubuntu系统下制作U盘启动盘
  • 原文地址:https://www.cnblogs.com/king1302217/p/1937949.html
Copyright © 2011-2022 走看看