在没使用反射之前,跨项目级的调用普遍的做法是项目级添加引用。
举例:client 类调用 mysqlhelper 类的话
首先生成 mysqlhelper 项目,
然后在 client 类中添加 mysqlhelper.dll,
接着在 client 的方法中实例化,然后调用方法。
使用反射后,可以更加灵活配置,灵活使用。
如上图,客户端要调用数据库接口,数据库这里我们不明确写硬编码哪一个数据库(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>
运行结果
以上就是c# reflection 反射的内容。