System.Type
. Mỗi Object trong C# đều chứa thông tin metadata mà ta có thể truy xuất qua Type
.Type
theo 2 cách chính:Type
, bạn có thể:[Serializable]public class Player{ public string Name { get; private set; } public int Level { get; private set; }
public Player(string name, int level) { Name = name; Level = level; }
// Constructor không tham số public Player() { }
public void LevelUp() { Level++; Debug.Log("Player leveled up"); }}
private void Start(){ Player player = new Player("Dude", 1);
// Lấy Type metadata của Player Type playerType = player.GetType();
// Lấy giá trị thuộc tính Level bằng Reflection var level = playerType.GetProperty("Level").GetValue(player); Debug.Log($"Level: {level}"); // Output: Level: 1
// Liệt kê tất cả thuộc tính của Player PropertyInfo[] properties = playerType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (var property in properties) { Debug.Log($"Property Name: {property.Name}"); // Output: Name, Level }
// Kiểm tra và gọi các phương thức không có tham số MethodInfo[] methods = playerType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (var methodInfo in methods) { if (methodInfo.GetParameters().Length == 0) { Debug.Log($"Invoking: {methodInfo.Name}"); methodInfo.Invoke(player, null); // Gọi LevelUp và in ra "Player leveled up" } }
// Kiểm tra các attribute của lớp Player IEnumerable<Attribute> attributes = playerType.GetCustomAttributes(); foreach (var attribute in attributes) { Debug.Log($"Player class has an attribute named: {attribute.GetType().Name}"); // Output: SerializableAttribute }}
Lưu ý quan trọng: Reflection có thể làm chậm chương trình do chi phí xử lý trong thời gian chạy. Hãy cân nhắc sử dụng hợp lý, tránh dùng quá mức trong phần code yêu cầu hiệu năng cao.
Ưu điểm | Nhược điểm |
---|---|
Linh hoạt thao tác & truy xuất thông tin metadata | Gây ra chi phí hiệu năng runtime |
Hỗ trợ phát triển tool và framework nâng cao | Khó debug và bảo trì nếu lạm dụng |
Tăng khả năng tái sử dụng và mở rộng mã nguồn | Không kiểm tra lỗi lúc compile |