反射入门篇 (一)
对反射的使用一直接触不多,今天开始学习反射方面的基础知识,首先来了解下反射的概念:
1.什么是反射。
反射是指在程序运行过程中,动态的去加载一个程序集,从而实现对程序集内部的类和方法等的调用操作。
2. 反射能做什么。
反射能够完成如下操作:
(1). 获取程序集信息。
(2). 枚举程序集内的类型成员。
(3). 实例化程序集内的对象。
(4). 执行程序集内对象的成员,如方法,属性,等。
3. 如何实现反射。
反射的实现离不开两个重要的类:System.Type 和 System.Reflection 命名空间下的Assembly类。
要实现反射首先要动态的将程序集加载到当前运行的程序中,这里要用到的是Assembly类的相关方法:Load,LoadFrom。
Load 方法用于根据程序集的名称来加载程序集。
LoadFrom 方法则是根据程序集的路径来加载程序集。
使用Load方法时运行库会在本地目录和全局程序集缓存里进行程序集的查找搜索。而使用LoadFrom方法则是根据给定的程序集路径直接去加载程序集,不会去进行搜索,因此在我们知道程序集的存放路径时推荐使用LoadFrom方法来载入程序集,避免搜索的效率损耗, 这两个方法都有其他重载版本,在使用的时候可以灵活处理。
Type 类是许多反射功能的入口,它实现许多方法和属性,使用Type来确定数据的类型以及获取对应数据类型的成员信息。如:构造函数,方法,属性,事件等等。结合assembly类的GetTypes方法,返回程序集里所有类型的Type数组,也可以使用assembly的GetType方法来获取指定名称的Type对象,得到Type对象后可以进行实例化,进而通过实例化的对象来实现数据成员的调用。
4. 反射实现的一个简单示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 1 using System; 2 2 using System.Collections.Generic; 3 3 using System.Linq; 4 4 using System.Text; 5 5 using System.Threading; 6 6 using System.Reflection; 7 7 namespace MultiThread 8 8 { 9 9 class Program 10 10 { 11 11 static void Main(string[] args) 12 12 { 13 13 //当前执行程序程序集完整路径 14 14 string apppath = Assembly.GetExecutingAssembly().Location; 15 15 //截取目录路径 16 16 apppath = apppath.Substring(0, apppath.LastIndexOf("\\") + 1); 17 17 //加载指定路径的程序集 18 18 Assembly ass = Assembly.LoadFrom(apppath + "BusMonitor.Utils.dll"); 19 19 //这里从程序集中获得某个类型 20 20 Type t = ass.GetType("BusMonitor.Utils.Enc", false, true); 21 21 22 22 if (t != null) 23 23 { 24 24 //执行其中的某个方法 25 25 Object obj = t.InvokeMember("EncodeBase64", BindingFlags.InvokeMethod, null, null, new object[] { "erty789werw" }); 26 26 if (obj != null) 27 27 Console.WriteLine(obj); 28 28 } 29 29 30 30 Console.ReadLine(); 31 31 } 32 32 33 33 } 34 34 }
上面的一个例子简单的实现了反射,动态加载程序集,然后去调用程序集中的一个方法,输出返回的结果。反射的功能很强大,这里只是冰山一角,上面的示例中由于是调用程序集中某个类的静态方法,因此没有涉略到对应数据类型的实例化,下一篇中将着重介绍,获取对应数据类型后进行实例化的方法 ,每天进步一点点,坚持!