首页  >  文章  >  后端开发  >  C# Reflection 反射

C# Reflection 反射

黄舟
黄舟原创
2017-02-06 17:16:361224浏览

在没使用反射之前,跨项目级的调用普遍的做法是项目级添加引用。

举例:Client 类调用 MysqlHelper 类的话

  1. 首先生成 MysqlHelper 项目,

  2. 然后在 Client 类中添加 MysqlHelper.dll,

  3. 接着在 Client 的方法中实例化,然后调用方法。

使用反射后,可以更加灵活配置,灵活使用。

924.jpg

如上图,客户端要调用数据库接口,数据库这里我们不明确写硬编码哪一个数据库(MySQL, SQLServer, Oracle…)

这里先定义接口,假设该接口只有一个方法  Query() ,各种DB需要实现该接口,那么新添加的DB类型就不会影响到原来项目,这样就实现开放封闭原则(对修改关闭,对扩展开放)。

接口类 DbHelper.cs

using System;
namespace IHelper
{    
    public class DbHelper
    {        
        public DbHelper()        
        {
            Console.WriteLine("This is DbHelper construction");
        }        
        public virtual void Query()        
        {
            Console.WriteLine("This is query method");
        }
    }
}

OracleDbHelper.cs

using System;
using IHelper; 
namespace OracleHelper{    
    public class OracleDbHelper : DbHelper
    {        
        public override void Query()        
        {            
            base.Query();
            Console.WriteLine("This is query from OracleDbHelper");
        }
    }
}

MySqlDbHelper.cs

using System;
using IHelper; 
namespace MySqlHelper{    
    public class MySqlDbHelper :DbHelper
    {        
        public override void Query()        
        {
            base.Query();
            Console.WriteLine("This is query method from MySqlDbHelper");
        }
    }
}

Client 端 Program.cs 调用:
将数据库帮助类项目生成后的 dll、pdb 文件放到客户端 bin 目录下,然后在 App.config 里面增加配置,接着使用 Reflection 下的 Assembly 类去实现。

Program.cs

static void Main(string[] args){        
    string config = ConfigurationSettings.AppSettings["DbHelper"];
    Assembly assembly = Assembly.Load(config.Split(',')[0]);
    Type typeHelper = assembly.GetType(config.Split(',')[1]);
    Object oHelper = Activator.CreateInstance(typeHelper);
    DbHelper dbHelper = (DbHelper) oHelper;
    dbHelper.Query();
    Console.Read();
}

Client 端 App.config 配置:

<?xml version="1.0" encoding="utf-8" ?><configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <!--<add key="DbHelper" value="MySqlHelper,MySqlHelper.MySqlDbHelper"/>-->
    <add key="DbHelper" value="OracleHelper,OracleHelper.OracleDbHelper"/>
  </appSettings></configuration>

运行结果

925.jpg

以上就是C# Reflection 反射的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn