關於C#反射概念,附帶案例!

来源:https://www.cnblogs.com/chen233/archive/2023/12/13/17897313.html
-Advertisement-
Play Games

反射 C#中的反射是一種使程式在運行時能夠動態地獲取類型信息並調用其成員的技術。通過反射,程式可以在運行時進行類型的動態載入、創建對象、調用方法和屬性,以及訪問和修改欄位等。反射可以使程式更加靈活,但也增加了一定的性能開銷。 在C#中,反射主要是通過System.Reflection命名空間中的類來 ...


反射

C#中的反射是一種使程式在運行時能夠動態地獲取類型信息並調用其成員的技術。通過反射,程式可以在運行時進行類型的動態載入、創建對象、調用方法和屬性,以及訪問和修改欄位等。反射可以使程式更加靈活,但也增加了一定的性能開銷。

在C#中,反射主要是通過System.Reflection命名空間中的類來實現的。以下是一些常用的反射類和方法:

  1. Type類:Type類表示一個類型,可以通過其靜態方法獲取某個類型的Type對象,例如typeof關鍵字和Type.GetType()方法。Type類提供了許多有用的方法,如GetMethods()獲取類型的所有方法,GetProperties()獲取類型的所有屬性等。

  2. MethodInfo類:MethodInfo類表示一個方法,可以通過Type類的GetMethods()方法獲取一個類型的所有方法,然後使用MethodInfo對象來調用具體的方法。

  3. PropertyInfo類:PropertyInfo類表示一個屬性,可以通過Type類的GetProperties()方法獲取一個類型的所有屬性,然後使用PropertyInfo對象來訪問和修改具體的屬性。

  4. FieldInfo類:FieldInfo類表示一個欄位,可以通過Type類的GetFields()方法獲取一個類型的所有欄位,然後使用FieldInfo對象來訪問和修改具體的欄位。

反射的優點

雖然反射在性能和資源消耗方面存在一些開銷,但它在應用中仍然具有一些重要的優勢和用途,如下所示:

  1. 動態載入和調用:反射允許在運行時動態載入和調用類型、方法和成員。這對於需要動態擴展和插件化的應用程式非常有用,例如插件系統、腳本引擎等。通過反射,可以在運行時載入和使用不同的程式集和組件,從而使應用程式更具靈活性和可擴展性。

  2. 元數據操作:反射提供了一種方式來讀取和操作類型的元數據,包括屬性、欄位、方法、特性等的信息。這使得我們可以在運行時動態獲取和操作類型的結構和行為。這對於實現某些高級功能和框架,例如ORM(對象關係映射)、序列化庫、依賴註入容器等非常有用。

  3. 可擴展的代碼生成和編譯:反射使得我們可以動態生成和編譯代碼。這對於一些需要在運行時動態生成和執行代碼的場景非常有用,例如動態代理、AOP(面向切麵編程)、代碼生成器等。通過反射,我們可以在運行時創建並執行代碼,從而實現更高級的代碼生成和動態編程。

  4. 框架和工具的開發:反射是許多框架和工具的基礎,例如單元測試框架、序列化庫、ORM框架等。這些框架和工具需要在運行時通過反射來獲取和使用類型的信息,併在不同的場景中動態調用和操作代碼。通過反射,這些框架和工具可以更加靈活和通用,提供更高級的功能和擴展性。

需要強調的是,儘管反射在某些情況下會帶來性能開銷,但在大多數情況下,這些開銷並不會對應用程式的整體性能產生顯著的影響。在使用反射時,我們應該權衡其靈活性和便利性與性能之間的平衡,並根據實際需求來選擇合適的方法和工具。

 

反射的案例

 1 private void bt_Test_Click(object sender, System.Windows.RoutedEventArgs e)
 2 {
 3 //反射
 4         // 獲取MyClass類型的Type對象
 5         Type type = typeof(MyClass);
 6  7         // 創建MyClass對象
 8         object myClassObj = Activator.CreateInstance(type);
 9 10         // 獲取MyMethod方法的MethodInfo對象
11         MethodInfo methodInfo = type.GetMethod("MyMethod");
12 13         // 調用MyMethod方法
14         methodInfo.Invoke(myClassObj, null);
15 16         //Log.Write(str.ToString(),HaagonLibrary.Log.Log.EnumLogType.Warning);
17 18         Type type = typeof(MyClass);
19 20         // 動態調用反射方法
21         object myClassObj = Activator.CreateInstance(type);
22         MethodInfo methodInfo = type.GetMethod("MyMethod");
23 24         var stopwatch = Stopwatch.StartNew();
25         for (int i = 0; i < 1000000; i++)
26         {
27             methodInfo.Invoke(myClassObj, null);
28         }
29         stopwatch.Stop();
30         Log.Write("動態調用耗時:" + stopwatch.ElapsedMilliseconds + " 毫秒",                        HaagonLibrary.Log.Log.EnumLogType.Warning);
31         // 靜態調用反射方法
32         var myClass = new MyClass();
33 34         stopwatch.Restart();
35         for (int i = 0; i < 1000000; i++)
36         {
37             myClass.MyMethod();
38         }
39         stopwatch.Stop();
40         Log.Write("靜態調用耗時:" + stopwatch.ElapsedMilliseconds + " 毫秒", HaagonLibrary.Log.Log.EnumLogType.Warning);
41     }
42 }
43 public class MyClass
44 {
45     public void MyMethod()
46     {
47         Console.WriteLine("Hello, Reflection!");
48     }
49 }

 


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

-Advertisement-
Play Games
更多相關文章
  • 開始 日期格式化可以說是最常用的一個小知識了,例如格式化成"年-月-日"、"年-月-日 時-分-秒"、“年/月/日”等等,隨之也就出現了“yyyy-MM-dd”、"yyyy-MM-dd HH-mm-ss"等格式,使用不當就會一臉懵逼。 運行 public static void main(Strin ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹CheckBox單行輸入框組件的常用方法及靈活運用。QCheckBox是 Qt 中用於實現覆選框的組件,它提供了豐... ...
  • 隨著金融科技的不斷發展,越來越多的線上查詢工具被應用到汽車管理領域。一款名為汽車管理線上查詢工具,定位車輛,輕鬆追蹤的工具就是其中之一。此工具通過API介面代碼實現了車牌號查車輛信息、車輛故障碼、VIN查詢汽車品牌以及二手車估值等功能,為用戶提供了準確、便捷、高效的汽車管理服務。 首先,車牌號查車輛 ...
  • 數據的預處理是數據分析,或者機器學習訓練前的重要步驟。通過數據預處理,可以 提高數據質量,處理數據的缺失值、異常值和重覆值等問題,增加數據的準確性和可靠性 整合不同數據,數據的來源和結構可能多種多樣,分析和訓練前要整合成一個數據集 提高數據性能,對數據的值進行變換,規約等(比如無量綱化),讓演算法更加 ...
  • 1. 同城雙活是什麼 同城雙活是一種容災架構的設計模式,主要用於提高系統的可用性和容錯性。它通常涉及在同一個城市內建立兩個數據中心(機房),這兩個數據中心同時對外提供服務,實現了高可用性和冗餘。 關鍵特點和優勢包括: 雙活部署: 兩個數據中心都處於活躍狀態,同時處理用戶請求。這樣,當一個數據中心發生 ...
  • 公司某規則引擎系統,在每次發版啟動會手動預熱,預熱完成當流量切進來之後會偶發的出現一次長達1-2秒的Young GC(流量並不大,並且LB下的每個節點都會出現該情況)在這次長暫停之後,每一次的年輕代GC暫停時間又都恢覆在20-100ms以內2秒雖然看起來不算長吧,但規則引擎每次執行也才幾毫秒,這誰能... ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹`QRadioButton`單選框組件以及與之交互的`QButtonGroup`類的常用方法及靈活運用。`QRad... ...
  • 前幾天跟大家介紹了在winform中使用blazor hybrid,而且還說配上blazor的ui可以讓我們的winform程式設計的更加好看,接下來我想以一個在winform blazor hybrid中繪圖的例子來進行說明,希望對你有所幫助。 效果 在開始之前,先給大家演示一下效果,如下所示: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...