反射封裝了程序集、模塊、類型,支援運行時動態創建實例、綁定類型、調用方法/訪問字段屬性、讀取特性。本文通過最簡單示例演示核心流程。
// ReflectTest.cs -> 編譯為 ReflectTest.dll
namespace ReflectionTest {
public class WriteTest {
public void WriteString(string s, int i) {
Console.WriteLine("WriteString:" + s + i);
}
public static void StaticWriteString(string s) {
Console.WriteLine("StaticWriteString:" + s);
}
public static void NoneParaWriteString() {
Console.WriteLine("NoParaWriteString");
}
}
}
命令行編譯:csc /t:library ReflectTest.cs
using System; using System.Reflection;
class TestApp {
static void Main() {
Assembly ass;
Type type;
Object obj;
// 1. 加載程序集 (必須絕對路徑)
ass = Assembly.LoadFile(@"D:\...\ReflectTest.dll");
// 2. 獲取類型 (命名空間.類名)
type = ass.GetType("ReflectionTest.WriteTest");
// --- 示例 1:調用實例方法 ---
MethodInfo method = type.GetMethod("WriteString");
Object[] pars = new Object[] { "test", 1 };
obj = ass.CreateInstance("ReflectionTest.WriteTest"); // 必須創建實例
method.Invoke(obj, pars);
// 輸出: WriteString:test1
// --- 示例 2:調用靜態方法 ---
method = type.GetMethod("StaticWriteString");
method.Invoke(null, new object[] { "test" }); // 靜態方法第一個參數忽略 (null/obj/any 均可)
method.Invoke(obj, new object[] { "test" });
// 輸出: StaticWriteString:test (三次)
// --- 示例 3:調用無參靜態方法 ---
method = type.GetMethod("NoneParaWriteString");
method.Invoke(null, null);
// 輸出: NoParaWriteString
}
}
Assembly.LoadFile 需絕對路徑,相對路徑無效。GetType 需「命名空間.類名」。CreateInstance 創建實例,再 Invoke(instance, ...)。object[] 陣列對應方法簽名;也可 method.Invoke(obj, new object[] { "test", 1 })。Invoke 第一個參數被忽略,傳 null 即可;傳錯誤類型實例也不報錯 (但不規範)。null。Invoke(null, ...) 調用靜態成員。WriteString:test1
StaticWriteString:test
StaticWriteString:test
StaticWriteString:test
NoParaWriteString
反射是框架開發、插件系統、動態代理、ORM 映射等高級技術的基石。掌握 Assembly → Type → MethodInfo/PropertyInfo → Invoke/GetValue/SetValue 核心鏈路即可應對大多數動態編程場景。