前言:我们反射主要用到的类System.Type 类和 System.Reflection.Assembly类,通过System.Type这个类可以访谒关于 任何数据类型的信息。而System.Reflection.Assembly类,它可以用于访谒给定措施集的相关的信息。
我们先来介绍生活中的两个例子。
1:B超:大家体检的时候概略都做过B超吧,B超可以透过肚皮探测到你的内脏的生理情况。这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会孕育产生必然的“回音”反射,然后把“回音”进行措置惩罚惩罚就可以显示出内脏的情况了。
2.地球内部布局:地球的内部布局梗概可以分为三层:地壳、地幔和地核。地壳是固体,地核是液体,地幔则是半液半固的布局(中学地舆的内容,大家还记得吧?)。如安在地球外貌不用深入地球内部就知道其内部的结构呢?对,向地球发射“地震波”,“地震波”分两种一种是“横波”,另一种是“纵波”。“横波”只能穿透固体,而“纵波”既可穿透固体又可以穿透液体。通过在地面对纵波和横波的反回情况,我们就可以梗概断定地球内部的结构了。
大家可以注意到两个例子配合的特点:就是从一个东西的外部去了解东西内部的对象。而且都是操作了波的反射成果。在.Net中的反射也可以实现从东西的外部来了解东西(或者措施集)内部布局的成果。哪怕你不知道这个东西(或措施集)是个什么对象,此外.NET中的反射还可以运态创建出东西并执行它此中的要领。
一:反射的观点与Type类
通俗的说:反射通过措施,了解以及挪用“措施集”中的措施的相关的属性、要领和字段。
所以反射的感化我们总结:
1.通过反射我们可以读取措施集(.dll .exe)中的代码的内容。
2.可以按照(字符串)类名动态的创建类的东西。
3.可以动态获取东西中的信息(要领/属性/字段)。
4.可以按照(字符串)要领名称来挪用执行。
我们首先先来编写一个Persons类。我们通过反射来获取类中的要领、属性和字段。
/// <summary> /// 人类 /// </summary> public class Persons { private int _id; //id号 public string Name; //名字 public int Age; //春秋 /// <summary> /// id号的属性 /// </summary> public int Id { get { return _id; } set { _id = value; } } /// <summary> /// 显示id号 /// </summary> public void DisPlayId() { Console.WriteLine(this.Id); } /// <summary> /// 显示春秋 /// </summary> public void DisplayAge() { Console.WriteLine(this.Age); } /// <summary> /// 显示名称 /// </summary> public void DisplayName() { Console.WriteLine(this.Name); } }
这时候我们就可以实例化东西。通过Type类获取类的名称、所属的定名空间、是否为大众类以及类的字段、属性和要领等信息。
/// <summary> /// 盘问Type类的一些普通的信息 /// </summary> public static void Test1() { //实例化人类创建东西 Persons person = new Persons(); //Type类 可以获取名称 、所属的定名空间 、是否为大众类以及类的字段、属性、要领等信息. Type typePersonObj = person.GetType(); //显示类的名称 Console.WriteLine(typePersonObj.Name); //显示类所属的定名空间 Console.WriteLine(typePersonObj.Namespace); //显示所属的措施集 Console.WriteLine(typePersonObj.Assembly); //获取类的是否为大众 密封 私有 Console.WriteLine(typePersonObj.IsPublic);//T Console.WriteLine(typePersonObj.IsSealed);//F Console.WriteLine(typePersonObj.IsPrimitive);//F }