以下範例示範如何使用反射動態建立物件、呼叫方法、讀寫屬性與欄位:
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。此範例涵蓋了反射操作類別成員的常見場景,適合作為快速參考。