反射

       反射就是程序运行时,获取运行的类型信息。通俗的说,就是程序运行时,获取程序所用的类,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   实例

原文地址:https://www.cnblogs.com/king1302217/p/1937949.html