首页 > 代码库 > 简单反射机制
简单反射机制
1.什么是反射?
MSND:反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
反射的名称空间:System.Reflection,具体参考http://msdn.microsoft.com/zh-cn/library/system.reflection.aspx
小编理解:在做程序的时候,一般采取类的实例化,来操纵对象的行为。就是我们必须先创建对象,然后才可以利用对象的行为,而反射是在运行状态中,来知道类的所有的属性和方法,这种动态获取的信息以及动态调用对象的方法的功能称为反射。
2.引入DLL操作类
在程序中经常的引入DLL或者命名空间,就是通过引入编译好的DLL来操作类,看一个实例。
自己写的DLL
<span style="font-family:SimSun;font-size:18px;">namespace Test { public class Test { public int Add(int a,int b) { return a + b; } } } </span>
当把上述类编译后,我们可以在项目的bin\debug中看到编译好的DLL,在另外的项目中添加引用
<span style="font-family:SimSun;font-size:18px;">namespace aa { class Program { static void Main(string[] args) { Test.Test a = new Test.Test(); Console.WriteLine(a.Add(3, 4)); } } } </span>
当引入编译好的DLL后就可以,操作DLL中封装的类的行为,就是还需要实例化类为对象,才可以操纵类的行为。
2.利用反射动态创建类的实例
条件:我们创建两个类库来演示操作。
Add类:我们需要通过反射测试的类
Program类:控制台应用程序。
Add类
<span style="font-family:SimSun;font-size:18px;">namespace Add { class Add { /// <summary> /// 加法操作 /// </summary> /// <param name="a">参数一</param> /// <param name="b">参数二</param> /// <returns></returns> public int jia(int a, int b) { return a + b; } } }</span>
Program类
<span style="font-family:SimSun;font-size:18px;">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Test; using System.Reflection;//反射命名空间 namespace aa { class Program { static void Main(string[] args) { //反射机制动态创建类的实例 Add.Add b=Assembly.Load("Add").CreateInstance("Add.Add") as Add.Add; Console.WriteLine(b.jia(4, 9)); } } } </span>
实现起来特别的简单,主要是利用了Assembly类的一些方法,更多的方法,请参照MSDN.
3.配置文件解决创建类库操作
最近做过的一个Demo实例,通过反射机制,动态的创建程序集中的类库
前置条件:DALMYSQL.dll:程序集;
DALMSSQL.DBSessionFactory:类库中的一个工厂类
配置文件中加载项
<span style="font-family:SimSun;font-size:18px;"> <appSettings> <add key="DBSessionFactory" value=http://www.mamicode.com/"DALMSSQL.DBSessionFactory"/>>反射类库对象
Program测试类
<span style="font-family:SimSun;font-size:18px;"> class Program { static void Main(string[] args) { //1.读取配置文件 string strFactoryDLL = System.Configuration.ConfigurationManager.AppSettings["DBSessionFatoryDLL"]; string strFactoryType = System.Configuration.ConfigurationManager.AppSettings["DBSessionFatory"]; //2.加载程序集 Assembly dalDLL = Assembly.LoadFrom(strFactoryDLL); //获得程序集中要实例化的类的类型 Type typeDBSessionFactory = dalDLL.GetType(strFactoryType); //反射对象,需要进行强制转换 IDAL.IDBSessionFactory sessionFactory = Activator.CreateInstance(typeDBSessionFactory) as IDAL.IDBSessionFactory; } }</span>
分析:利用的特性还是一样,主要是Assembly程序集来加载反射。
-------------------------------欢迎点评---------------------------------------------------------------
简单反射机制