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="DALMSSQL.DBSessionFactory"/>
<!--添加对DLL的引用,引用的是路径>
<add key="DBSessionFactoryDLL" value="C:\Users\ZHOU\Desktop\Tree\MVCOA\MVCOA\MVCOA\bin\DALMYSQL.dll"/>
</appSettings></span>
反射类库对象
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程序集来加载反射。
-------------------------------欢迎点评---------------------------------------------------------------