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

.NET 反射機制完整指南:從 RTTI 到動態載入組件

     編輯:關於.NET

反射讓程式在執行時檢查、操作型別中繼資料,實現動態建構物件、呼叫方法、載入外部組件等進階功能。本文系統整理 .NET 反射核心概念與實戰技巧。

運行時型別識別 (RTTI)

關鍵字用途範例
is型別相容性檢查if (obj is MyClass)
as安全轉型,失敗回傳 nullvar mc = obj as MyClass;
typeof取得編譯期型別的 Type 物件Type t = typeof(StringBuilder);

核心類別:System.Type

  • 繼承自 MemberInfo,封裝型別完整中繼資料。
  • 常用屬性:FullName、IsClass、IsInterface、IsSealed、BaseType、Assembly。
  • 常用方法:GetMethods()、GetProperties()、GetConstructors()、GetFields()、GetEvents()、GetInterfaces()、GetCustomAttributes()。

四大關鍵反射技術

1. 取得方法資訊

Type t = typeof(MyClass);
MethodInfo[] methods = t.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var m in methods)
{
    Console.Write($"{m.ReturnType.Name} {m.Name}(");
    var pars = m.GetParameters();
    for (int i = 0; i < pars.Length; i++)
        Console.Write($"{pars[i].ParameterType.Name} {pars[i].Name}{(i+1<pars.Length?", ":"")}");
    Console.WriteLine(")");
}

2. 動態呼叫方法

var obj = new MyClass(10, 20);
MethodInfo mi = t.GetMethod("Set", new[]{typeof(int), typeof(int)});
mi.Invoke(obj, new object[]{9, 10}); // 呼叫 Set(9,10)

3. 動態建構物件

ConstructorInfo ci = t.GetConstructor(new[]{typeof(int), typeof(int)});
var instance = ci.Invoke(new object[]{5, 6}); // new MyClass(5,6)

4. 從組件載入型別

Assembly asm = Assembly.LoadFrom(@"C:\Path\MyLib.dll");
Type[] types = asm.GetTypes();
foreach (Type type in types)
{
    Console.WriteLine(type.FullName);
    // 進一步用上述技術操作型別
}

BindingFlags 過濾旗標

  • Public / NonPublic
  • Instance / Static
  • DeclaredOnly(不含繼承成員)
  • 至少需指定一個存取層級 + 一個靜態/實體旗標,否則回傳空陣列。

效能與最佳實務

  • 反射比直接呼叫慢數量級,**緩存 Type/MethodInfo/PropertyInfo** 物件重用。
  • 高效能場景改用 Expression Tree 編譯委派、DynamicMethod 或 Roslyn 原始碼生成。
  • 避免在熱路徑循環呼叫 GetMethods() 等重型 API。

應用場景

  • 外掛架構、依賴注入容器、序列化庫、ORM 對映、單元測試框架、動態代理 (Castle/DispatchProxy)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved