`dynamic` 是 C# 4.0 引入的靜態型別,但標記為「動態繫結」。編譯器對 `dynamic` 物件假定支援所有操作(方法呼叫、屬性存取、索引子、運算子),不進行靜態型別檢查,全部推遲至執行期由 DLR (Dynamic Language Runtime) 解析。
dynamic obj = GetSomeObject(); // 可能是 COM、DOM、Python 物件等
obj.UpdateWordDocument(); // 編譯通過,執行期若無此方法 → RuntimeBinderException
dynamic d = "hello";
var len = d.Length; // dynamic (屬性存取)
var s = (string)d; // string (轉換)
var sb = new StringBuilder(d); // StringBuilder (建構函式參數)
dynamic d = 10;
int i = d; // 隱含轉換 dynamic → int
double db = d; // 隱含轉換 dynamic → double
// 執行期若型別不相容 → InvalidCastException
// C# 3.0 風格
object file = "Test.docx";
object missing = Missing.Value;
doc.SaveAs(ref file, ref missing, ref missing, ...); // 16 個 ref missing
// C# 4.0 + dynamic (搭配 /link 編譯選項嵌入 PIAs)
doc.SaveAs("Test.docx"); // 直接呼叫,參數自動封送
| ✅ 建議使用 | ❌ 避免使用 |
|---|---|
| Office/COM 自動化 | 核心高效能路徑 (靜態型別快 10-100x) |
| 動態語言互通 (Python/Ruby/JS) | 領域模型核心 (失去編譯期保護、重構困難) |
| HTML DOM / JSON 動態存取 | 公開 API 介面 (呼叫端無法獲得型別資訊) |
| 原型快速驗證 | 大型專案核心邏輯 |
`dynamic` 讓 C# 以靜態語言身分擁抱動態世界,威力巨大但請謹慎使用。核心業務邏輯堅持強型別,邊界整合層善用 `dynamic`,才是平衡之道。