C# 中反射的介绍

来源:互联网 发布:网络无武侠小说 编辑:程序博客网 时间:2024/06/06 16:52


   反射无处不在,我们天天在使用。Vs的智能提示,就是通过反射获取到类的属性、方法等。还有反编译工具也是通过反射实现

1.什么是元数据???:有关程序以及类型的数据被称作是元数据。
2 什么叫反射???  一个运行的程序查看本的元数据或是其他程序的元数据的行为就叫做反射。


namespace 反射{    class Program    {        static void Main(string[] args)        {            //请写一段程序输出:Person类中有几个方法,几个属性。以及每个方法名和属性名。            // Person p = new Person();            //获取Person类的“档案”            //其实这个“档案”就是描述Person类型的一个类。【类型元数据】            // Type typePerson = typeof(Person);            Person p = new Person();            Type typePerson = p.GetType();            Console.WriteLine("Person的父类:{0}", typePerson.BaseType.ToString());            Console.WriteLine("Person类中的属性:");            //获取Person类中的所有的属性            PropertyInfo[] pinfo = typePerson.GetProperties();            for (int i = 0; i < pinfo.Length; i++)            {                Console.WriteLine(pinfo[i].Name);            }            Console.WriteLine("Person类中的方法:");            MethodInfo[] minfo = typePerson.GetMethods();                        for (int i = 0; i < minfo.Length; i++)            {                Console.WriteLine(minfo[i].Name);            }            //反射里面最重要的就是要获取这个类型对应的Type            //获取这个Type以后,就可以根据这个Type,获取当前类型的所有相关信息。            Console.ReadKey();        }    }    public class Person    {        public string Name        {            get;            set;        }        public int Age        {            get;            set;        }        public string Email        {            get;            set;        }        public void SayHi()        {            Console.WriteLine("hi!!");        }    }}


有关Type类型的事项:

  1.Type是抽象类型,他被设计用来包含类的特性。由于是抽象的,因此不可以实例化。但是CLR在运行的时候,创建从Type类派生类的对象。这个对象包含可类型的信息,当我们访问这些实例的时候,CLR返回的是Type类的引用【多态,发生隐士转换】

   2.程序中用的每个类型,CLR都会创建包含该类型信息的Type类型的引用。

   3 程序中用到的每个类型都会关联到独立的Type类的对象。

   4.不管创建的类型的实例还有多少,只有一个Type对象会关联到这些实例。

获取Type对的方式

Assembly asm=Assembly.LoadFile("具体的.dll文件所在完整路径");

  1) Type  type= asm.GetType("具体的某个类所在命名空间.类名")

  2)对于接口或者抽象类可以使用Type t =  typeof(接口名或者抽象类名)

 

5)type几个重要的方法:

  1. bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。

Typeof(IPlugin).IsAssignableFrom(t)         

  2. boolIsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)

  3.bool IsSubclassOf(Type c):判断当前类是否是类c的子类。类的事,没有接口的事。

IsAbstract,判断是否为抽象的,含接口

 

 //得到类型person的所有属性(public)

 PropertyInfo[] properties =type.GetProperties();

            properties[i].Name 显示属性的名字

 //得到所有字段

            FieldInfo[]fields = type.GetFields();

//得到所有方法

            MethodInfo[]methods = type.GetMethods();

【小结】:反射中最重要的就是获得所需类型的对应的type类

有了type这个类就可以获取当前类的所有信息



0 0