.Net—反射

在学习反射之前,先来理解以下几个概念。

什么是程序集?

程序集是.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);

持续更新....

欢迎评论留言交流
原文地址:https://www.cnblogs.com/netlws/p/8948496.html