跟著AI學習C# Day21

📅 Day 21:動態類型與動態語言運行時(Dynamic Types & DLR)

? 學習目標:

  • 理解什么是 dynamic 類型
  • 掌握 dynamicobject 的區別;
  • 理解 DLR(Dynamic Language Runtime) 的作用;
  • 學會使用 dynamic 簡化反射、COM 互操作等場景;
  • 理解 ExpandoObjectDynamicObject 的用法;
  • 編寫一個基于 dynamic 的 JSON 解析器或腳本執行器示例。

🧠 一、什么是 dynamic 類型?

在 C# 中,dynamic 是一種特殊的類型,它繞過了編譯時的類型檢查,將類型解析延遲到運行時進行。

示例:

dynamic x = 10;
x = "Hello";       // 合法
x = new Person();  // 合法

?? 編譯時不檢查成員是否存在,運行時才會拋出異常。


🔁 二、dynamic vs object

特性objectdynamic
編譯時類型檢查??
運行時解析??
性能更快稍慢(需 DLR 解析)
適合場景多態、泛型反射簡化、腳本交互

💡 三、DLR(Dynamic Language Runtime)

DLR(動態語言運行時) 是 .NET Framework 4 引入的一個子系統,用于支持動態語言(如 Python、Ruby)在 .NET 平臺上的運行。它也支撐了 C# 中的 dynamic 功能。

DLR 的核心功能包括:

  • 運行時綁定(Runtime Binding)
  • 動態對象解析(如 COM 對象、Python 對象)
  • 緩存機制優化性能

🧩 四、常見使用場景

場景 1:簡化反射調用

傳統反射方式:

object obj = GetSomeObject();
MethodInfo method = obj.GetType().GetMethod("DoWork");
method.Invoke(obj, null);

使用 dynamic

dynamic obj = GetSomeObject();
obj.DoWork();  // 編譯不報錯,運行時自動解析

場景 2:COM 互操作(如 Excel 自動化)

Type excelType = Type.GetTypeFromProgID("Excel.Application");
dynamic excel = Activator.CreateInstance(excelType);
excel.Visible = true;
excel.Workbooks.Add();

場景 3:處理不確定結構的數據(如 JSON)

string json = "{\"Name\":\"張三\",\"Age\":25}";
dynamic data = JsonSerializer.Deserialize<JsonElement>(json);Console.WriteLine(data.Name);
Console.WriteLine(data.Age);

🧱 五、System.Dynamic 命名空間

C# 提供了幾個類來幫助你創建自定義的動態對象:

1. ExpandoObject

表示一個可以在運行時動態添加和刪除成員的對象。

dynamic person = new ExpandoObject();
person.Name = "李四";
person.Age = 30;person.SayHello = new Action(() => Console.WriteLine("你好!"));person.SayHello();  // 輸出:你好!

2. DynamicObject

你可以繼承此類并重寫其方法來自定義動態行為。

public class MyDynamic : DynamicObject
{private Dictionary<string, object> _properties = new();public override bool TrySetMember(SetMemberBinder binder, object value){_properties[binder.Name] = value;return true;}public override bool TryGetMember(GetMemberBinder binder, out object result){return _properties.TryGetValue(binder.Name, out result);}
}// 使用
dynamic obj = new MyDynamic();
obj.Name = "王五";
Console.WriteLine(obj.Name);  // 輸出:王五

🧪 六、動態表達式樹(Expression Trees)

雖然 dynamic 很方便,但如果你需要高性能的動態行為,推薦使用 Expression<TDelegate> 構建動態委托。

ParameterExpression param = Expression.Parameter(typeof(int), "x");
Expression body = Expression.Multiply(param, param);
Func<int, int> square = Expression.Lambda<Func<int, int>>(body, param).Compile();Console.WriteLine(square(5));  // 輸出:25

💪 實戰練習:構建一個簡單的動態 JSON 解析器

功能要求:

  • 從 API 獲取 JSON 數據;
  • 使用 dynamic 解析并輸出字段;
  • 支持嵌套屬性訪問。
示例代碼:
using System;
using System.Net.Http;
using System.Text.Json;class Program
{static async Task Main(){using HttpClient client = new HttpClient();string json = await client.GetStringAsync("https://jsonplaceholder.typicode.com/users/1");dynamic user = JsonSerializer.Deserialize<JsonElement>(json);Console.WriteLine("用戶ID:" + user.id);Console.WriteLine("用戶名:" + user.username);Console.WriteLine("地址城市:" + user.address.city);}
}

?? 七、注意事項與最佳實踐

建議說明
避免濫用 dynamic它犧牲了編譯時安全性和 IDE 智能提示
不要用于公共 API應該優先使用接口或泛型
謹慎用于性能關鍵路徑DLR 有額外開銷
在反射、JSON、COM 場景中合理使用可顯著提升開發效率

📝 小結

今天你學會了:

  • dynamic 類型的基本概念及其與 object 的區別;
  • 了解了 DLR(動態語言運行時) 的作用;
  • 掌握了如何使用 dynamic 簡化反射、COM 互操作、JSON 解析等場景;
  • 學會使用 ExpandoObjectDynamicObject 創建自定義動態對象;
  • 編寫了一個基于 dynamic 的 JSON 解析器示例;
  • 了解了 dynamic 的性能影響及適用場景。

dynamic 是 C# 中非常強大的工具,尤其適用于與外部系統交互、快速原型開發等場景。但在大型項目中應謹慎使用以確保可維護性。


🧩 下一步學習方向(Day 22)

明天我們將進入一個新的主題 —— LINQ(Language Integrated Query)基礎與進階,你將學會如何使用 LINQ 查詢集合、數據庫、XML,并掌握查詢語法與方法語法的區別。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88228.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88228.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88228.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode-3085.成為K字符串需要刪除的最小字符串數

題目描述 解題思路 這題不難想到需要統計每個字母的出現頻率&#xff0c;一共有26個字母&#xff0c;故cnt數組有26維。我們可以枚舉其中一種作為「刪除操作結束后出現頻率最低的字符」&#xff0c;將其設置為 c&#xff0c;那么所有頻率小于 c 的字符都會被刪除&#xff0c;所…

Android 中 解析 XML 文件的幾種方式

在 Android 開發中,解析 XML 文件有多種方式,每種方式都有其特點和適用場景。常見的 XML 解析方式有 DOM 解析、SAX 解析 和 XmlPullParser 解析。 一、xml 文件及數據類 1、xml 文件 將測試用 book.xml 文件放在項目的 app/src/main/assets 目錄下,文件內容如下:<lib…

python里的abc庫是什么東西

Python 中的 ABC&#xff1a;為什么你需要抽象基類&#xff1f;告別“假鴨子”&#xff0c;擁抱真抽象&#xff01; 你是不是經常在 Python 項目中感到困惑&#xff1a;我定義了一個類&#xff0c;希望它能被其他類繼承并實現某些特定功能&#xff0c;但又不想它被直接實例化&…

設計模式精講 Day 9:裝飾器模式(Decorator Pattern)

【設計模式精講 Day 9】裝飾器模式&#xff08;Decorator Pattern&#xff09; 文章內容 在軟件開發中&#xff0c;靈活擴展功能是提升系統可維護性和可復用性的關鍵。裝飾器模式作為一種結構型設計模式&#xff0c;為對象動態地添加職責&#xff0c;而無需通過繼承來實現。它…

瀏覽器無法訪問:Nginx下的基于域名的虛擬主機

檢查步驟如下&#xff1a; 1、nginx -t &#xff0c;檢查配置文件是否有語法錯誤 [root89 ~]# nginx -t nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok nginx: configuration file /opt/nginx/conf/nginx.conf test is successful # 可以看到 配置…

【appium】6.appium遇到的問題

1.appium-python-client 修改版本1.5 為5.1.1,后執行python程序時&#xff0c;提示&#xff1a; raise TypeError( TypeError: missing 1 required keyword-only argument: options (instance of driver options.Options class) 你遇到的錯誤&#xff1a; TypeError: missing…

C++法則3:使用拷貝和交換的賦值運算符自動就是異常安全的,且能正確處理自賦值。

C法則3&#xff1a;使用拷貝和交換的賦值運算符自動就是異常安全的&#xff0c;且能正確處理自賦值。 這條法則強調了使用"拷貝和交換"(Copy-and-Swap)慣用法來實現賦值運算符()的優點&#xff1a; 關鍵點 異常安全&#xff1a;拷貝和交換方法天然提供了強異常安全…

純血HarmonyOS5 打造小游戲實踐:掃雷(附源文件)

鴻蒙掃雷游戲的核心架構設計 鴻蒙OS掃雷游戲采用了MVC&#xff08;模型-視圖-控制器&#xff09;的架構思想&#xff0c;將游戲邏輯與UI展示分離&#xff0c;使得代碼結構清晰且易于維護。整個游戲由以下幾個核心部分構成&#xff1a; 數據模型設計 游戲的基礎數據模型是Cel…

Linux C語言的opendir如何獲取目錄下的隱藏文件

在 Linux 文件系統中&#xff0c;所謂隱藏文件是文件名以 . 開頭的文件&#xff08;例如 .bashrc、.git、.config 等&#xff09;。 在編程層面&#xff0c;opendir readdir 并不會自動排除隱藏文件。 只要你不在代碼中手動過濾&#xff0c;readdir 會把目錄下所有文件&#…

母線槽接頭過熱隱患難防?在線測溫方案實時守護電力安全

近年來&#xff0c;由于各種設備對電力的大力需求&#xff0c;并有逐年增加的趨勢&#xff0c;傳統電路接線方式在施工時越來越力不從心。系統一旦定型&#xff0c;后續想要簡化變更更是難上加難。母線槽方案因此興起&#xff0c;憑借多點連接&#xff08;接頭、插接頭、插接箱…

Windows本地部署wordpress

一、下載wordpress 地址&#xff1a;Download – WordPress.org 下載后解壓出來 二、下載小皮面板 地址&#xff1a;Windows版phpstudy下載 - 小皮面板(phpstudy) 下載后安裝 三、打開小皮面板&#xff0c;安裝對應內置應用 1、MySQL8&#xff08;注意要是8版本,卸載其他版本…

Android 性能優化

一、Android中檢測性能工具 Profiler —— 使用Profiler的CPU分析功能。 Method Tracing ———— 通過該方法,我們可以記錄應用運行過程中的方法調用情況,包括每個方法的執行時間、調用次數等。 Systrace 是Android平臺提供的一款工具,用于記錄短期內的設備活動。 Systra…

圖片壓縮工具 | Electron應用配合 commander 提供命令行調用功能

OPEN-IMAGE-TINY&#xff0c;一個基于 Electron VUE3 的圖片壓縮工具&#xff0c;項目開源地址&#xff1a;https://github.com/0604hx/open-image-tiny 功能描述 應用程序的命令行調用功能允許用戶通過終端&#xff08;如Windows的CMD/PowerShell或Linux/macOS的Terminal&am…

Linux》》Shell腳本 基本語法

執行腳本的三種方式 查找變量的過程 變量引用的順序》》先從當前進程查詢變量&#xff0c;如果當前進程沒有此變量&#xff0c;默認去父進程查找這個變量。如果查找到則返回&#xff0c;否則一直查找到 祖宗&#xff08;PID為1&#xff09;&#xff0c;還沒有&#xff0c;則就…

C#.VB.NET多線程,多用戶下獨立鎖和全局鎖的區別

以下代碼,每個客戶端都分配了一個鎖嗎? 用戶WebSocket信息類Public Class UserWebSocketInfoPublic Property SessionID As StringPublic Property WebSocket As WebSocketPublic Property LastResponseTime As DateTimePublic Property PendingHeartbeatCount As IntegerPubl…

無人機加速器模塊技術解析

一、加速器模塊的運行方式 1. 傳感器數據采集與融合 加速度計核心作用&#xff1a;測量三維線性加速度&#xff08;X/Y/Z軸&#xff09;&#xff0c;結合陀螺儀&#xff08;角速度&#xff09;和磁力計&#xff08;方向&#xff09;構成九軸姿態傳感器&#xff0c;實時輸出…

用html實現數字生命

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>數學粒子動畫</title><style>body {mar…

SQLite3 在嵌入式系統中的應用指南

SQLite3 在嵌入式系統中的應用指南 一、嵌入式系統中 SQLite3 的優勢 SQLite3 是嵌入式系統的理想數據庫解決方案&#xff0c;具有以下核心優勢&#xff1a; 特性嵌入式系統價值典型指標輕量級適合資源受限環境庫大小&#xff1a;500-700KB零配置無需數據庫管理員開箱即用無…

通義大模型與現有企業系統集成實戰《CRM案例分析與安全最佳實踐》

1. 集成架構設計 &#xff08;1&#xff09;混合部署架構演進 #mermaid-svg-eW4YPoU2fdbnT4xp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-eW4YPoU2fdbnT4xp .error-icon{fill:#552222;}#mermaid-svg-eW4YPoU2f…

leetcode:746. 使用最小花費爬樓梯

學習要點 動態規劃正著推動態規劃倒著推理解遞歸在動態規劃與純遞歸的類比分析中體會兩者各自的特點 題目鏈接 746. 使用最小花費爬樓梯 - 力扣&#xff08;LeetCode&#xff09; 題目描述 解法1&#xff1a;動態規劃倒著推 // dp[i]--->從第i階樓梯到達樓頂最小花費int…