首页 > 代码库 > 简单反射机制

简单反射机制

 

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


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


 


 




简单反射机制