C#中的反射是指程式在執行時動態地取得並操作類型資訊的一種機制。透過反射,我們可以在執行時間取得類型、存取類型的成員(屬性、方法、欄位等),建立實例並呼叫方法,甚至可以動態地修改類型的成員。
反射在許多場景下非常有用,特別是在編寫通用程式碼或框架時。它允許我們在不知道具體類型的情況下,根據資訊動態地載入並使用類型。
C#中的反射主要由System.Reflection
命名空間下的一些類別和介面來支援。其中,Assembly
類別用於載入和存取組件信息,Type
類別用於獲取和操作類型信息,MethodInfo
類別用於獲取和操作方法信息,PropertyInfo
類別用於取得和操作屬性資訊等等。
下面透過一個具體的程式碼範例來示範如何使用反射。
using System; using System.Reflection; class MyClass { public int MyProperty { get; set; } public void MyMethod() { Console.WriteLine("Hello, reflection!"); } } class Program { static void Main(string[] args) { // 加载程序集 Assembly assembly = Assembly.GetExecutingAssembly(); // 获取类型 Type myClassType = assembly.GetType("MyNamespace.MyClass"); // 创建实例 object myClassInstance = Activator.CreateInstance(myClassType); // 获取属性 PropertyInfo myProperty = myClassType.GetProperty("MyProperty"); // 设置属性值 myProperty.SetValue(myClassInstance, 42); // 获取方法 MethodInfo myMethod = myClassType.GetMethod("MyMethod"); // 调用方法 myMethod.Invoke(myClassInstance, null); } }
上面的程式碼首先透過Assembly.GetExecutingAssembly()
方法取得目前組件的信息,然後使用GetType
方法取得MyClass
的Type
物件。接下來,透過Activator.CreateInstance
方法建立了MyClass
的實例。
透過反射,我們取得了MyProperty
和MyMethod
的信息,並使用SetValue
方法設定了屬性的值,使用 Invoke
方法呼叫了方法。
透過這個簡單的例子,我們可以看到反射的強大之處,它使我們能夠在運行時動態地載入、存取和修改類型的成員,實現更靈活和通用的程式碼設計。然而,反射可能會帶來效能上的開銷,所以在效能要求較高的場景下,需要謹慎使用。
以上是C#中的反射機制簡介的詳細內容。更多資訊請關注PHP中文網其他相關文章!