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

C# 4.0 dynamic 關鍵字實戰(一)— 替代反射簡化框架架構

     編輯:關於C語言

痛點:框架架構中大量反射代碼

做框架設計時,處處需要反射,代碼冗長、效能差、難維護。C# 4.0 引入 dynamic 可**完全取代反射**,大幅簡化代碼。

實戰:日誌追蹤器框架升級

原持久數據層調用日誌組件 (Zivsoft.Log.dll) 使用反射,升級為 dynamic 後:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.IO;

namespace Zivsoft.Data
{
    internal class Logger
    {
        private static Assembly _assemblyFile;
        private static dynamic _logger;

        static Logger()
        {
            var dllPath = AppDomain.CurrentDomain.BaseDirectory + "Zivsoft.Log.dll";
            if (File.Exists(dllPath))
            {
                _assemblyFile = Assembly.LoadFile(dllPath);
                try
                {
                    // dynamic 直接調用,無需 MethodInfo.Invoke
                    _logger = _assemblyFile.CreateInstance("Zivsoft.Log.Logger",
                        false, BindingFlags.CreateInstance, null, null, null, null);
                }
                catch { _logger = null; }
            }
        }

        public static void LogInfo(string message, params object[] args)
        {
            _logger?.LogInfo(message, args);  // 直接調用,編譯期不檢查
        }

        public static void LogWarning(string message, params object[] args)
            => _logger?.LogWarning(message, args);

        public static void LogError(string message, params object[] args)
            => _logger?.LogError(message, args);

        public static void LogDebug(string message, params object[] args)
            => _logger?.LogDebug(message, args);

        public static void LogError(Exception e)
            => LogError("{0}", e);
    }
}

dynamic vs 反射 對比

維度反射dynamic
代碼行數多行 (GetMethod/Invoke 等)單行直接調用
可讀性低高,像調用強型別
編譯期檢查無無 (運行期綁定)
效能較慢DLR 快取,通常更快
IntelliSense無無

適用場景擴展

作者計劃將持久數據層框架中 SQLServer、MySQL、Access 等資料庫驅動的反射調用**全部替換為 dynamic**。

注意事項

  • dynamic 為運行期綁定,**編譯期不報錯**,拼寫錯誤只會在運行時拋出 RuntimeBinderException
  • 搭配 ?. 空條件運算子防禦性編程
  • 效能敏感熱路徑建議測試對比
  • 非公開成員需 InternalsVisibleTo 或反射
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved