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

C# 4.0 dynamic 關鍵字巧用:取代反射呼叫

     編輯:關於C#

背景

框架設計常需動態載入組件並呼叫其中類型,傳統做法大量使用反射,程式碼冗長且難讀。C# 4.0 引入 dynamic 關鍵字,配合 DLR(動態語言執行環境),可大幅簡化動態呼叫。

實際案例:日誌元件動態載入

原專案依賴 Zivsoft.Log.dll,但不想強制所有專案參考此組件。改用 dynamic 後:

internal class Logger {
    private static Assembly _assembly;
    private static dynamic _logger; // 動態型別

    static Logger() {
        string dllPath = AppDomain.CurrentDomain.BaseDirectory + "Zivsoft.Log.dll";
        if (File.Exists(dllPath)) {
            _assembly = Assembly.LoadFile(dllPath);
            try {
                // 建立實例並指派給 dynamic 變數
                _logger = _assembly.CreateInstance("Zivsoft.Log.Logger",
                    false, BindingFlags.CreateInstance, null, null, null, null);
            } catch { _logger = null; }
        }
    }

    public static void LogInfo(string msg, params object[] args) {
        _logger?.LogInfo(msg, args); // 直接呼叫,編譯期不檢查
    }
    public static void LogWarning(string msg, params object[] args) => _logger?.LogWarning(msg, args);
    public static void LogError(string msg, params object[] args) => _logger?.LogError(msg, args);
    public static void LogDebug(string msg, params object[] args) => _logger?.LogDebug(msg, args);
    public static void LogError(Exception ex) => LogError("{0}", ex);
}

優點分析

  • 程式碼簡潔:無需 MethodInfo.Invoke、PropertyInfo.GetValue 等反射繁瑣語法。
  • 可讀性高:呼叫語法與強型別完全相同。
  • 錯誤延遲到執行期:若方法不存在或參數不符,執行時拋出 RuntimeBinderException。
  • 專案解耦:編譯時不需參考 Zivsoft.Log.dll,缺少組件時僅停用日誌功能,不影響主程式運行。

適用情境

  • 外掛架構:動態載入第三方組件並呼叫共同介面。
  • COM 互操作:簡化 IDispatch 呼叫。
  • 動態語言互通:與 IronPython、IronRuby 物件交互。
  • 選用性功能模組:如本例日誌、資料庫提供者切換等。

注意事項

  • dynamic 會產生額外 DLR 呼叫站點快取,效能略低於強型別與反射(首次呼叫較慢,後續較快)。
  • 編譯期無智慧提示與型別檢查,需仰賴單元測試保障正確性。
  • 避免在效能極度敏感的熱路徑大量使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved