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

C# 反射概念以及實例詳解(一):基本概念、類別庫建立與三種方法調用完整實例

     編輯:關於C語言

反射核心能力

  • 封裝組件/模組/型別資訊
  • 動態建立型別實例
  • 將型別繫結至現有物件
  • 從物件取得型別並調用方法/存取欄位/屬性
  • 存取自訂屬性

步驟 1:建立類別庫 (ReflectTest.cs)


using System;

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 → 產生 ReflectTest.dll

步驟 2:反射調用三種方法完整代碼


using System;
using System.Reflection;

class TestApp
{
    public static void Main()
    {
        Assembly ass;
        Type type;
        Object obj;
        Object any = new Object(); // 靜態方法測試用

        // 載入組件 (必須絕對路徑)
        ass = Assembly.LoadFile(@"D:\Source Code\...\ReflectTest.dll");
        type = ass.GetType("ReflectionTest.WriteTest"); // 命名空間+類別名

        // 範例 1:實例方法 (有參數)
        MethodInfo method = type.GetMethod("WriteString");
        Object[] parameters = new Object[] { "test", 1 };
        obj = ass.CreateInstance("ReflectionTest.WriteTest"); // 必須實例化
        method.Invoke(obj, parameters);

        // 範例 2:靜態方法 (有參數)
        method = type.GetMethod("StaticWriteString");
        method.Invoke(null, new string[] { "test" });      // 第一參數無視
        method.Invoke(obj, new string[] { "test" });       // 傳實例也可
        method.Invoke(any, new string[] { "test" });       // 傳任意物件也可

        // 範例 3:靜態方法 (無參數)
        method = type.GetMethod("NoneParaWriteString");
        method.Invoke(null, null); // 兩參數皆 null
    }
}

關鍵 API 對照

場景CreateInstanceInvoke 第 1 參數Invoke 第 2 參數
實例方法必要實例參數陣列
靜態方法 (有參)不需要無視 (null/實例/任意)參數陣列
靜態方法 (無參)不需要nullnull
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved