在学习反射之前,先来理解以下几个概念。
什么是程序集?
程序集是.net中的概念。
.Net中的dll文件与exe文件都是程序集。(exe与dll的区别?)
exe文件是可执行文件,有执行入口。可直接运行。而dll不可以直接运行,可供其它程序调用。
程序集(Assembly)可以看做是一堆相关类打一个包,相当于Java中的Jar包。
程序集包含资源文件、类型元数据(描述在代码中定义的每一类型和成员,二进制形式)、IL代码(这些都被装在exe或dll中),每个程序集都有自己的名称、版本等信息。这些信息可以通过Assembly.cs文件来自定义。
使用程序集的好处?
程序中只引用必须的程序集,减小程序的尺寸。
程序集可以封装一些代码,只提供必要的访问接口。
方便功能拓展,不需要修改源代码。
什么是反射?
反射就是动态获得程序集里面的元数据。(比如获取某一个类里面的属性和方法,后面会有代码演示)
如何添加程序集的引用?
添加路径、项目引用
不能循环添加引用
代码演示
新建一个空白解决方案,添加一个控制台应用程序和一个名为Common的类库。在Common里面添加一个Person类和Student类,代码如下
1 public class Person 2 { 3 public Person(string name, int age) 4 { 5 this.name = name; 6 this.age = age; 7 } 8 9 private string tel; 10 11 public Person() 12 { 13 } 14 public string name{ get; set; } 15 public int age { get; set; } 16 public void SayHello() { 17 18 Console.WriteLine("我是Preson类里面的SayHello方法"); 19 } 20 21 private void SayEnglish() 22 { 23 Console.WriteLine("我是Preson类里面的SayEnglish方法"); 24 } 25 } 26 27 class Student 28 { 29 30 } 31 在Common右击选择生成,此时在Common下的bin/debug目录下生成了一个名为:Common.dll的程序集文件。将此文件复制到控制台应用程序下的bin/debug目录 32 33 //获取路径 34 string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Common.dll"); 35 //加载程序集文件 36 Assembly ass = Assembly.LoadFile(path); 37 Console.WriteLine("加载程序集成功.."); 38 39 //获得程序集中所有公开的数据 40 Type[] types = ass.GetExportedTypes(); 41 42 //获得程序集中所有公开的数据和不公开的数据 43 //Type[] types = ass.GetTypes(); 44 foreach (Type type in types) 45 { 46 Console.WriteLine(type.FullName); 47 Console.WriteLine(type.Name); 48 Console.WriteLine(type.Namespace); 49 } 50 51 Console.ReadKey();
执行结果
加载程序集成功..
Common.Person
Person
Common
若使用 Type[] types = ass.GetTypes();结果为:
加载程序集成功..
Common.Person
Person
Common
Common.Student
Student
Common
1 //获得指定的数据类型 2 Type t = ass.GetType("Common.Person"); 3 //获取Type中的所有方法 4 MethodInfo[] mis = o.GetType().GetMethods(); 5 foreach (MethodInfo mi in mis) 6 { 7 Console.WriteLine(mi.Name); 8 } 9 // 获取属性 10 PropertyInfo[] pros = o.GetType().GetProperties(); 11 foreach (PropertyInfo type in pros) 12 { 13 Console.WriteLine(type.Name); 14 } 15 //调用了Person类中默认的无参数的构造函数 16 object o = ass.CreateInstance("Common.Person"); 17 18 // object o = Activator.CreateInstance(t, "zhangsan", 5); 19 Console.WriteLine(o.GetType()); //获取当前类的实例 20 MethodInfo mdi = o.GetType().GetMethod("SayHello"); 21 mdi.Invoke(o,null);
持续更新....