简单反射机制

来源:互联网 发布:酷家乐设计软件下载 编辑:程序博客网 时间:2024/04/30 00:54

 

 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程序集来加载反射。


-------------------------------欢迎点评---------------------------------------------------------------


 


 



0 0