在沒使用反射之前,跨項目級的調用普遍的做法是項目級添加引用。
舉例: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 反射的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!