C# 反射
原文鏈接:http://www.rzrgm.cn/ysmc/p/18802677
介紹(摘抄網絡)
C# 中的反射是一個強大的功能,它允許程序在運行時檢查和操作對象的類型信息。通過反射,可以動態地創建對象、調用方法、訪問字段和屬性,甚至是私有的成員。這一特性在需要編寫靈活和動態代碼的場景下非常有用,比如插件系統、序列化操作、依賴注入框架等。
反射的關鍵類和命名空間
反射功能主要通過 System.Reflection 命名空間中的類來實現,以下是一些核心的類:
Type:表示類型聲明:類類型、接口類型、數組類型、值類型、枚舉類型、類型參數、泛型類型定義以及開放或封閉的構造泛型類型。MethodInfo、ConstructorInfo、FieldInfo、PropertyInfo等:表示相應的成員信息,并提供了用于訪問成員元數據的方法。Activator:提供了創建類型實例的方法,包括使用參數創建實例和訪問無參構造函數的能力。
反射的使用
以下是一些使用反射的示例:
獲取類型信息
1 var type = typeof(MyClass); // 通過類型名獲取類型信息 2 var sameType = myObject.GetType(); // 通過對象實例獲取類型信息 3 Console.WriteLine(type.FullName); // 輸出類型的完全限定名
創建對象實例
1 var type = typeof(MyClass); 2 var myInstance = (MyClass)Activator.CreateInstance(type);
調用方法
1 var methodInfo = type.GetMethod("MyMethod"); 2 methodInfo.Invoke(myInstance, new object[] { /* 方法參數 */ });
讀取和設置字段或屬性
1 var fieldInfo = type.GetField("myField", BindingFlags.NonPublic | BindingFlags.Instance); 2 var fieldValue = fieldInfo.GetValue(myInstance); // 獲取字段值 3 fieldInfo.SetValue(myInstance, newValue); // 設置新的字段值 4 5 var propertyInfo = type.GetProperty("MyProperty"); 6 var propertyValue = propertyInfo.GetValue(myInstance); // 獲取屬性值 7 propertyInfo.SetValue(myInstance, newValue); // 設置新的屬性值
反射的優點和缺點
優點
- 靈活性:允許程序動態地創建和操作對象,而不需要在編譯時知道具體的類型。
- 強大的功能:可以訪問類型的所有信息,包括私有成員。
- 適用性:特別適用于需要大量動態行為的應用程序,如框架開發、插件系統等。
缺點
- 性能開銷:反射操作通常比直接代碼訪問要慢,因為涉及到動態類型信息的查詢和操縱。
- 安全性:允許繞過正常的訪問限制,例如修改私有字段,這可能會導致代碼更加難以理解和維護。
- 復雜性:正確使用反射需要對C#類型系統有深入的理解。
本文來自博客園,作者:一事冇誠,轉載請注明原文鏈接:http://www.rzrgm.cn/ysmc/p/18802677

浙公網安備 33010602011771號