C#的程序集和反射

版权声明:未经本人同意不得转载 https://blog.csdn.net/jjjndk1314/article/details/85017596

我们所写的所有代码 都会 编译到 程序集文件中,并在运行时以【Assembly对象】 方式 加载 到内存中运行。
为什么要加载到内存?因为2原因:读取快,运行编译快;不需要每次读取硬盘程序集里的il代码,然后解析语法。

程序集的组成
程序集: *.exe , *.dll -> 加载到内存中 就是 Assembly对象
类:每个 class , interface -> 加载到内存中 就是 Type对象
类的成员:方法,字段,属性,事件等 -> 加载到内存中也有相应的对象
重点命名空间:System.Reflection

反射概念:
1.在程序运行时,(动态获取类或对象的信息)
动态 获取 加载程序集(Assmebly)
动态 获取 类型(如类、接口 等) - Type对象
动态 获取 类型的成员 信息(如方法,字段,属性等);
2.在运行时,动态创建类型实例(new),以及 调用 和 访问 这些 实例 成员;

.Net反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为.Net的反射机制。
.Net反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;

//通过反射获得程序集的方式:
//1.获取当前正在运行的程序集
//1.1通过当前对象获取 类型 所属的程序集
  Assembly ass1 = this.GetType().Assembly;
//1.2通过静态方法获取正在运行的程序集
  Assembly ass2 = Assembly.GetExecutingAssembly();
  S02BLL.Person p = new S02BLL.Person();
//2.根据当前【应用程序域】获取 程序集
  Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies();
//3.根据指定的程序集路径加载程序集
  Assembly ass3 = Assembly.LoadFrom(@"F:\DelegateEvent.dll");

//通过反射类型对象 Type 的方式:
//1.*通过typeof 获取 类 对应的类型对象
  Type t1 = typeof(Model.Student);
//2.*通过对象 的 GetType方法 -- GetType方法 来自 Object 类!
  Model.Student stu = new Model.Student();
  Type t2 = stu.GetType();
  Type t3 = this.GetType();
//3.通过 程序集 获取类
  Assembly curAss = Assembly.GetExecutingAssembly();
//this.GetType().Assembly
//*获取程序集里 指定名称 的 类型对象 注意:必须写类的全名称!
  Type t4 = curAss.GetType("S01GenericAndReflection.Model.Student");
//获取程序集里所有的类型对象
  Type[] types = curAss.GetTypes();
//获取程序集里 所有 公共的 类型对象
  Type[] publicTypes = curAss.GetExportedTypes();

猜你喜欢

转载自blog.csdn.net/jjjndk1314/article/details/85017596
今日推荐