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

C# 反射技術:讀取與設定類別屬性 (三) 實戰範例

     編輯:關於C語言

完整範例程式

以下範例示範如何使用反射動態建立物件、呼叫方法、讀寫屬性與欄位:

using System;
using System.Reflection;

namespace ConsoleApplication9
{
    class Love
    {
        public int field1;
        private string _name;
        public Love() { }
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public int GetInt(int a) { return a; }
        public void Display(string str) { Console.WriteLine(str); }
    }

    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            Love love = new Love();
            Type type = love.GetType();
            // 動態建立實例(雖然此處已有實例,僅示範語法)
            Object obj = type.InvokeMember(null,
                BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic |
                BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args);

            // 呼叫無傳回值方法
            type.InvokeMember("Display", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] { "aldfjdlf" });

            // 呼叫有傳回值方法
            int i = (int)type.InvokeMember("GetInt", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] { 1 });
            Console.WriteLine(i);

            // 設定屬性值
            type.InvokeMember("Name", BindingFlags.SetProperty, null, obj, new string[] { "abc" });
            // 取得屬性值
            string str = (string)type.InvokeMember("Name", BindingFlags.GetProperty, null, obj, null);
            Console.WriteLine(str);

            // 設定欄位值
            type.InvokeMember("field1", BindingFlags.SetField, null, obj, new object[] { 444 });
            // 取得欄位值
            int f = (int)type.InvokeMember("field1", BindingFlags.GetField, null, obj, null);
            Console.WriteLine(f);

            Console.ReadLine();
        }
    }
}

關鍵說明

  • InvokeMember 是反射呼叫成員的核心方法,透過 BindingFlags 指定搜尋與呼叫行為。
  • 設定/取得屬性使用 SetProperty/GetProperty;欄位使用 SetField/GetField。
  • 陣列參數需與目標方法簽章匹配,傳回值需轉型。

此範例涵蓋了反射操作類別成員的常見場景,適合作為快速參考。

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