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

C# 動靜結合編程(三):Duck Typing 與 dynamic 關鍵字——打破靜態型別邊界

     編輯:關於C#

依賴倒置的三種風格:從約束到協議

組件間依賴兩種基本模式:

  1. 正向依賴:A 直接引用 B 型別定義(強耦合)
  2. 反向依賴 (IoC):A 定義介面,B 實作介面並引用 A,由 C 粘合

介面 IoC 雖具編譯期檢查,但整合第三方元件需撰寫 Adapter 包裝,靈活性受限。委託 IoC 消除型別依賴,僅需簽名相容,更靈活。極致是 HTTP+XML/JSON 協議式整合,甚至跨語言,但失去編譯期保護。

委託是「中庸之道」:保留 IDE 提示與編譯器簽名檢查,又不產生組件依賴。

Duck Typing:把委託思想延伸到物件

「走起來像鴨子、叫起來像鴨子,就當它是鴨子」。關注 物件能做什麼,而非繼承自誰。純粹實現:

object person = new Person(); // 未實作 IPerson
IPerson duck = Duck.Create(person); // 動態代理實作介面
Console.WriteLine($"{duck.Name} will be {duck.Age + 1} next year");
duck.Play("basketball");

C# 實現途徑:System.Reflection.Emit 動態生成實作目標介面的代理類別,攔截呼叫轉發至目標物件反射調用。Castle DynamicProxy 是成熟庫,極簡完成此功能。

C# 4.0 dynamic:動態型別原生支援

string json = @"{ ""FirstName"": ""John"", ""Age"": 21 }";
dynamic person = CreateFromJson(json);
Console.WriteLine($"{person.FirstName} will be {person.Age + 1} next year");
person.Play("basketball"); // 編譯通過,執行期拋異常

dynamic 關閉編譯期型別檢查,全部轉為執行期反射調用。便利但 失去所有靜態保護,類似 HTTP+XML 協議模式。

理想中庸:帶型別參數的動態存取

// 概念碼:屬性/方法名動態,但型別靜態檢查
string firstName = person.Property("FirstName");
int age = person.Property("Age");
Func toJson = person.Method>("ToJson");
Action play = person.Method>("Play");

此模式在 C# 2.0 即可用 Dynamic 包裝類實現:

object jsonObj = CreateFromJson(...);
Dynamic person = new Dynamic(jsonObj);
string firstName = person.Property("FirstName");

保留動態名稱靈活性,同時享受屬性型別與方法簽名的編譯期檢查,將執行期錯誤降至最低。

下一步

下篇將實作 Dynamic 類別,敬請期待。

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