您好,欢迎访问一九零五行业门户网

C# Reflection 反射

在没使用反射之前,跨项目级的调用普遍的做法是项目级添加引用。
举例: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 反射的内容。
其它类似信息

推荐信息