第十二讲 Reflection反射

反射:  就是我们感兴趣的对象,通过反射可以发现内部的细节(对象内部各种成员信息)
 
          正常创建一个对象,你要得到这个对象的全部信息很方便,但是我们为了对象的自动封装或者然对象更灵活,使用泛型,object这样的,在拿到内部的信息就不是那么方便了, 因为有各种转化 ,父类子类的转化,
 
程序集的感念: 程序集是应用程序的部署单元
.Net应用程序包含了一个活多个程序集,通常扩展名是exe,dll,的.Net可执行程序,称为程序集
.Net的程序集包含元数据,这些元数据描述了程序中定义的所有类型和成员信息,就是方法,属性,事件...
在一个程序集中可以有不同命名空间,同一个命名空间也可以分布到多个程序集
命名空间和程序集:命名空间是一个程序集内相关类型的一个分组,程序集和命名空间不存在必然联系
命名空间是类库的逻辑组织形式,程序集是类库的物理组织形式
如何限定一个类型: 必须同时指定类型所在的命名空间,以及实现该类型的程序集
 
反射使用:
     
              1:)通过反射创建对象
                          ///第一种直接加载程序集名称
            Assembly ass1 = Assembly.Load("ConsoleApplication16");
 
            //第二种加载程序集文件名
            Assembly ass2 = Assembly.LoadFrom("ConsoleApplication16.exe");
 
            //第三种加载文件路径
            string path = System.IO.Directory.GetCurrentDirectory() + "\\ConsoleApplication16.exe";
            Assembly ass3 = Assembly.LoadFile(path);
 
            Type[] types = ass3.GetTypes();
            foreach(var ty in types)
            {
                Console.WriteLine("程序集名称:" + ty.Name);
                Console.WriteLine("程序集路径:" + ty);
 
            }
            Console.WriteLine("-----------------------------------创建对象-----------------------");
            //通过激活器创建对象
            Type type = ass3.GetType("ConsoleApplication16.BaseStudent");
            BaseStudent bstud = (BaseStudent)Activator.CreateInstance(type);
            bstud.Name = "赵占龙";
            Console.WriteLine(bstud.Name);
            //通过程序集创建
            BaseStudent bstud2 = (BaseStudent)Assembly.Load("ConsoleApplication16").CreateInstance("ConsoleApplication16.BaseStudent");
            bstud2.Name = "ttt";
            Console.WriteLine(bstud2.Name);
 
 
 
posted @ 2019-10-16 11:14  瀚海行舟  阅读(112)  评论(0编辑  收藏  举报