第十二讲 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);