dynamic 是什麼?
聲明動態物件,編譯期跳過型別檢查,執行期依據實際型別解析成員呼叫。本質是編譯器自動產生反射程式碼。
為何需要 dynamic?
- C# 2.0/3.0 面對無介面/基類資訊的未知型別,需手寫反射 → 麻煩且易錯。
- C# 4.0
dynamic 簡化為兩行:
dynamic unknowObj = GetDynamicObject();
unknowObj.Print(); // 執行期解析 Print 方法
代價與限制
- 無 IntelliSense:VS 無法知曉執行期型別。
- 效能較慢:底層仍是反射 (DLR 快取緩解)。
四大核心應用場景 (官方文件)
- 自動反射:簡化
Type.GetMethod/Invoke 樣板碼。
- COM 互操作:Office 自動化、老版 COM 元件無需 Primary Interop Assembly。
- 動態語言整合:IronPython/IronRuby 物件無縫互呼。
- HTML DOM 操作:瀏覽器 DOM 物件動態成員存取。
結論
dynamic 非萬靈丹,但在上述場景極大提升開發效率。善用 DLR (Dynamic Language Runtime) 統一動態呼叫管線,讓 C# 擁抱動態特性。