码迷,mamicode.com
首页 > 其他好文 > 详细

反射-获取程序集的type

时间:2015-07-11 22:39:23      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

反射的基本概念

  • 反射无处不在,我们天天在使用。Vs的智能提示,就是通过反射获取到类的属性、方法等。还有反编译工具也是通过反射实现。
  • 反射:就是动态获取程序集的元数据(提供程序集的类型信息)的功能。

Type类实现反射的一个重要的类,通过它我们可以获取类中的所有信息包括方法、属性等。可以动态调用类的属性、方法。

1,Type是对类的描述。如何获取Person类中的所有方法和属性?

            Person p = new Person();
            Type tp = p.GetType();//获取当前实例的类型; typeof(Person); 
            //获取该Person中所有的方法
            MethodInfo[] methes = tp.GetMethods();
            for (int i = 0; i < methes.Length; i++)
            {
                Console.WriteLine(methes[i].Name);
            }

            Console.WriteLine("=================");
            //获取所有的属性
            PropertyInfo[] ptyInfos = tp.GetProperties();
            for (int i = 0; i < ptyInfos.Length; i++)
            {
                Console.WriteLine(ptyInfos[i].Name);
            }
            Console.ReadKey();

2,如何调用一个程序集的方法和属性?

调用Assembly的GetExportedTypes方法可以得到Assembly中定义的所有的public类型。

调用Assembly的GetTypes()方法可以得到Assembly中定义的所有的类型。

调用Assembly的GetType(name)方法可以得到Assembly中定义的全名为name的类型信息。

           string path = @"E:\百度云同步盘\Study\Net_Chapter08_NetAdvanced\NetAdvanced\MyClass\bin\Debug\MyClass.dll";
            Assembly ass = Assembly.LoadFile(path);//加载指定路径上程序集文件的内容
            Type[] tps = ass.GetExportedTypes();//根据拿到的程序集内容,获取公共类型
            for (int i = 0; i < tps.Length; i++)
            {
                Console.WriteLine(tps[i].Name);
                MethodInfo[] ms = tps[i].GetMethods();
                for (int j = 0; j < ms.Length; j++)
                {
                    Console.WriteLine(ms[j].Name);
                }
            }
            Console.ReadKey();

通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法等,这个就叫做“反射”。
Type类的几个常用方法:

Activator.CreateInstance(Type t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
GetConstructor(参数列表);//这个是找到带参数的构造函数。
Type类四个方法:在编写调用插件的程序时,需要做一系列验证。

  • bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断c类型变量能否赋值给当前的类型的变量。       
  • bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)
  • bool IsSubclassOf(Type c):判断当前类是否是c的子类。类的事,没有接口的事。
  • IsAbstract,判断是否为抽象的,含接口

            Type tpPerson = ass.GetType("MyClasses.Person");
            Type tpStudent = ass.GetType("MyClasses.Student");
            Type tpAnimal = ass.GetType("MyClasses.Animal");
            Console.WriteLine(tpAnimal.IsAbstract);
            Type tpIFly = ass.GetType("MyClasses.IFly");
            Console.WriteLine(tpIFly.IsAbstract);

            //tpStudent是tpPerson的子类--判断
            bool result = tpStudent.IsSubclassOf(tpPerson);
            Console.WriteLine(result);

            //obj是否是tpPerson的一个实例
            object obj = Activator.CreateInstance(tpStudent);
            bool result1 = tpPerson.IsInstanceOfType(obj);
            Console.WriteLine(result1);

           

            //tpStudent能不能赋值给tpPerson
            bool r = tpPerson.IsAssignableFrom(tpStudent);
            Console.WriteLine(r);


            object ob = Activator.CreateInstance(tpPerson);
            bool r1 = tpPerson.IsInstanceOfType(ob);
            Console.WriteLine( r1);

反射-获取程序集的type

标签:

原文地址:http://www.cnblogs.com/sean100/p/4639354.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!