反射(3)反射應用:一個插件項目

来源:http://www.cnblogs.com/mcgrady/archive/2017/06/13/7001236.html
-Advertisement-
Play Games

前面總結了反射的使用,這一篇結合一個完整的項目來總結下反射的實際應用。 項目結構 如下圖: 定義插件介面 在項目ConsoleApplication6.IService中,定義了兩個介面,Run代表行駛,Trun代表轉向,如下代碼: 插件程式實現 這裡新建了兩個項目分別實現插件程式,分別是Conso ...


  前面總結了反射的使用,這一篇結合一個完整的項目來總結下反射的實際應用。

項目結構

如下圖:

 

定義插件介面

在項目ConsoleApplication6.IService中,定義了兩個介面,Run代表行駛,Trun代表轉向,如下代碼:

 1 namespace ConsoleApplication6.IService
 2 {
 3     /// <summary>
 4     /// 創建一個車的介面
 5     /// </summary>
 6     public interface ICarService
 7     {
 8         /// <summary>
 9         /// 行駛
10         /// </summary>
11         void Run();
12 
13         /// <summary>
14         /// 轉向
15         /// </summary>
16         /// <param name="direction"></param>
17         void Turn(Direction direction);
18 
19     }
20 
21     public enum Direction
22     {
23         East,
24         Weast,
25         South,
26         North
27     }
28 }

 

 

插件程式實現

這裡新建了兩個項目分別實現插件程式,分別是ConsoleApplication6.Service.BMW和ConsoleApplication6.Service.BenZ,代碼如下:

 1 namespace ConsoleApplication6.Service.BMW
 2 {
 3     public class BMWCarService: ICarService
 4     {
 5         /// <summary>
 6         /// 行駛
 7         /// </summary>
 8         public void Run()
 9         {
10             Console.WriteLine("BMW Car Run!");
11         }
12 
13         /// <summary>
14         /// 轉向
15         /// </summary>
16         /// <param name="direction"></param>
17         public void Turn(Direction direction)
18         {
19             Console.WriteLine(string.Format("BMW Car turn:{0}", direction.ToString()));
20         }
21     }
22 }
 1 namespace ConsoleApplication6.Service.BenZ
 2 {
 3     public class BenZCarService: ICarService
 4     {
 5         /// <summary>
 6         /// 行駛
 7         /// </summary>
 8         public void Run()
 9         {
10             Console.WriteLine("BenZ Car Run!");
11         }
12 
13         /// <summary>
14         /// 轉向
15         /// </summary>
16         /// <param name="direction"></param>
17         public void Turn(Direction direction)
18         {
19             Console.WriteLine(string.Format("BenZ Car turn:{0}", direction.ToString()));
20         }
21     }
22 }

 

運行程式

接下來我們就可以利用反射來運行這個插件程式了,如下代碼:

 1 namespace ConsoleApplication6
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             var assembly = Assembly.Load("ConsoleApplication6.Service.BMW");//也可以從配置文件中讀取
 8             var t = assembly.GetType("ConsoleApplication6.Service.BMW.BMWCarService");//也可以從配置文件中讀取
 9 
10             //創建一輛車的實例
11             var obj = Activator.CreateInstance(t);
12             ICarService car = obj as BMWCarService;
13             if (car != null)
14             {
15                 car.Run();
16                 car.Turn(Direction.East);
17             }
18 
19             Console.ReadKey();
20         }
21     }
22 }

 

這樣,一個簡單的插件程式就完成了,同時,如果我們開發類似的插件框架,就會大量使用到反射技術。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用專業術語來說, 進程是程式的一次動態執行.說簡單點, 就是進程是系統中的某個任務.操作系統中有多個任務需要執行, 那麼怎樣執行才能使它們同步呢? 即如何讓任務併發執行互不影響呢? 這就引出了進程同步中的經典問題: 生產者消費者問題, 哲學家進餐問題, 讀寫問題 生產者-消費者問題 有一群生產者進程 ...
  • 上一篇遠程桌面採用的獨立服務配置不適用於過多用戶,這一篇採用超級Internet伺服器搭建vnc服務可以解決多用戶問題。 vnc之xinetd服務搭建配置 Linux遠程桌面(一):vnc之獨立服務配置 步驟一: (1)檢查是否安裝vnc服務和xinetd服務 (2)若沒有這兩項服務就需要安裝 /e ...
  • 前提: 公司除了領導和開發人員具有管理員許可權,其他人員使用的都是域賬號。 過程: 應要求開發一個 winfrom項目,使用data.oracleclient 本地開發,調試無誤,放到伺服器共用域用戶使用,報錯 OCIEnvCreate 失敗, 返回代碼為-1 , 百思不得其解,網上也有很多這種錯誤, ...
  • 1. Create a windows service project 2. Add Reference to the assembly which contains the contract and its implementation. 3. Remove the Service1.cs, ad ...
  • 一、Parallel類 Parallel類提供了數據和任務的並行性; 二、Paraller.For() Paraller.For()方法類似於C#的for迴圈語句,也是多次執行一個任務。使用Paraller.For()方法,可以並行運行迭代,迭代的順序沒有定義。 在For()方法中,前兩個參數是固定 ...
  • Hello all , 我又回來了 這次我們真是開始來聊聊開源項目里,小而有用的模塊或者組件的開發思想。 同時,軟體已經更新到1.60的版本了,支持新用戶註冊,可以不再使用統一的test賬戶了。 您可以通過以下路徑進行下載: 1、在GitHub上fellow一下項目,下載到本地,生成一下,即可獲取最 ...
  • 很多人都說使用反射會有性能問題,那到底會比直接調用慢多少呢,下麵就來測試一下。 直接調用vs反射調用 下麵就來寫個demo來驗證下直接調用和反射調用的性能差異,代碼如下: 測試結果: 從100萬次調用結果來看,確實就像很多人所說的,兩者在性能上具有數量級的差距。 為什麼反射有性能損失 既然反射性能有 ...
  • C#編譯器對靜態類進行瞭如下限制: 1,靜態類必須直接從基類System.Obect派生,從其他任何基類派生都沒有意義。繼承只適用於對象,而你不能創建靜態類的實例 2,靜態類不能實現任何介面,這是因為只有適用類的實例時,才可調用介面方法 3,靜態類只能定義靜態成員(欄位,方法,屬性和事件),任何實例 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...