首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 反射機制深度解析:原理、應用與效能優化策略

     編輯:關於.NET

反射概念圖

什麼是 .NET 反射?

定義:審查中繼資料並收集類型資訊的能力。

中繼資料:描述儲存於 CLR 可攜式執行檔(PE)或記憶體中程式的二進位資訊。編譯為 PE 檔時,中繼資料嵌入檔案一部分;程式碼轉為 MSIL 嵌入另一部分。模組或組件中定義/引用的每個類型與成員皆於中繼資料中描述。執行時,執行階段將中繼資料載入記憶體,用於發現類別、成員、繼承等資訊。

中繼資料儲存內容

  • 組件描述:身分(名稱、版本、文化特性、公開金鑰)、匯出類型、相依組件、安全權限
  • 類型描述:名稱、可視性、基類、實作介面、成員(方法、欄位、屬性、事件、巢狀類型)
  • 屬性:修飾類型與成員的額外描述性元素

核心命名空間與類別

System.Reflection 命名空間包含解析中繼資料表的核心類別:

System.Reflection.MemberInfo
System.Reflection.EventInfo
System.Reflection.FieldInfo
System.Reflection.MethodBase
System.Reflection.ConstructorInfo
System.Reflection.MethodInfo
System.Reflection.PropertyInfo
System.Type
System.Reflection.Assembly

反射的主要用途

  1. 動態建立類型實例、繫結現有物件、從物件獲取類型
  2. 執行時從特定組件載入特定類型完成任務
  3. 類庫需知道類型定義以提供更多功能

應用要點與效能考量

  • 工廠模式常搭配反射實作
  • 動態繫結犧牲效能:CLR 需驗證參數、檢查權限等,速度極慢
  • 部分中繼資料無法透過反射取得
  • 某些反射類型專供 CLR/編譯器開發者使用

組件載入方法比較

方法說明建議
Load帶組件識別載入,套用策略,搜尋 GAC、應用程式基目錄、私有路徑極力推薦
LoadFrom傳檔案路徑載入指定組件,不含版本/文化/金鑰資訊特定場景使用
LoadWithPartialName無法確定載入版本永遠不要使用,將被淘汰

反射層次模型

反射層次模型

應用程式域 → 組件 → 模組 → 類型 → 成員。反射提供封裝組件、模組、類型的物件。

核心反射操作對照表

目標使用類別關鍵方法
載入組件、查找類型、建立實例AssemblyGetTypes、CreateInstance
了解模組資訊ModuleGetTypes、GetMethods
建構函式資訊ConstructorInfoGetConstructors、GetConstructor
方法資訊MethodInfoGetMethods、GetMethod、Invoke
欄位資訊與值存取FieldInfoGetFields、GetValue/SetValue
事件資訊與處理器EventInfoAddEventHandler/RemoveEventHandler
屬性資訊與值存取PropertyInfoGetProperties、GetValue/SetValue
參數資訊ParameterInfoGetParameters

進階:System.Reflection.Emit

提供在執行時建構類型的特殊反射形式,可動態生成 IL 程式碼。

反射效能優化策略

效能損失來源(由小到大):比較類型 < 遍歷成員 < 調用成員。

優化方案:

  1. 替代晚繫結:
    • 繼承已知基類,呼叫虛擬方法
    • 實作已知介面,透過介面呼叫虛擬方法
    • 使用委託(相對較慢但優於直接反射調用)
  2. 減少動態調用成員頻率
  3. 採用後期繫結
  4. 避免在迴圈中使用反射產生放大效應
  5. 快取 MethodInfo、PropertyInfo 等反射物件

完整範例:動態載入 Calculator.dll 並調用方法

Calculator.dll 類別圖

Calculator 介面定義

Calculator 實作類別

透過反射檢查與調用:

反射載入組件

反射獲取方法資訊

反射調用方法

反射完整代碼

執行結果:

執行結果1

執行結果2

總結:反射功能強大但效能代價高,生產環境核心路徑應謹慎使用,善用快取與替代模式平衡靈活度與效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved