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

C# 反射 核心概念與實戰詳解:動態加載程序集、創建實例、調用方法

     編輯:關於C#

反射封裝了程序集、模塊、類型,支援運行時動態創建實例、綁定類型、調用方法/訪問字段屬性、讀取特性。本文通過最簡單示例演示核心流程。

準備:類庫項目

// 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
    }
}

關鍵注意點

  1. 路徑:Assembly.LoadFile 需絕對路徑,相對路徑無效。
  2. 類型全名:GetType 需「命名空間.類名」。
  3. 實例方法:必須先 CreateInstance 創建實例,再 Invoke(instance, ...)。
  4. 參數傳遞:object[] 陣列對應方法簽名;也可 method.Invoke(obj, new object[] { "test", 1 })。
  5. 靜態方法:Invoke 第一個參數被忽略,傳 null 即可;傳錯誤類型實例也不報錯 (但不規範)。
  6. 無參方法:兩個參數均傳 null。
  7. 靜態類:無法實例化,直接 Invoke(null, ...) 調用靜態成員。

輸出結果

WriteString:test1
StaticWriteString:test
StaticWriteString:test
StaticWriteString:test
NoParaWriteString

反射是框架開發、插件系統、動態代理、ORM 映射等高級技術的基石。掌握 Assembly → Type → MethodInfo/PropertyInfo → Invoke/GetValue/SetValue 核心鏈路即可應對大多數動態編程場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved