Reflection trong C# là một tính năng mạnh mẽ cho phép bạn truy cập và thay đổi thông tin về các kiểu dữ liệu, phương thức, thuộc tính, và các thành phần khác của một chương trình tại runtime. Điều này rất hữu ích khi bạn cần khám phá hoặc thao tác với các đối tượng một cách động. Dưới đây là hướng dẫn chi tiết về cách sử dụng Reflection để truy cập và thay đổi dữ liệu tại runtime trong C#.
1. Truy Cập Thông Tin Về Các Thành Phần
Reflection cho phép bạn truy cập thông tin về các lớp, phương thức, thuộc tính, trường, và các thành phần khác của một đối tượng.
Lấy thông tin về lớp và các thành phần của nó:
using System;
using System.Reflection;
public class Person
{
public string Name { get; set; }
private int age;
public Person(string name, int age)
{
Name = name;
this.age = age;
}
public void PrintInfo()
{
Console.WriteLine($"Name: {Name}, Age: {age}");
}
}
class Program
{
static void Main()
{
// Lấy thông tin về lớp Person
Type personType = typeof(Person);
// Lấy các thuộc tính của lớp
PropertyInfo[] properties = personType.GetProperties();
Console.WriteLine("Properties:");
foreach (PropertyInfo property in properties)
{
Console.WriteLine(property.Name);
}
// Lấy các phương thức của lớp
MethodInfo[] methods = personType.GetMethods();
Console.WriteLine("\nMethods:");
foreach (MethodInfo method in methods)
{
Console.WriteLine(method.Name);
}
// Lấy các trường của lớp
FieldInfo[] fields = personType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Console.WriteLine("\nFields:");
foreach (FieldInfo field in fields)
{
Console.WriteLine(field.Name);
}
}
}
2. Tạo Đối Tượng và Gọi Phương Thức
Reflection cũng cho phép bạn tạo các đối tượng và gọi phương thức của chúng tại runtime.
Tạo đối tượng và gọi phương thức:
class Program
{
static void Main()
{
Type personType = typeof(Person);
// Tạo một đối tượng của lớp Person
object personInstance = Activator.CreateInstance(personType, "John Doe", 30);
// Gọi phương thức PrintInfo
MethodInfo printInfoMethod = personType.GetMethod("PrintInfo");
printInfoMethod.Invoke(personInstance, null);
}
}
3. Truy Cập và Thay Đổi Giá Trị Thuộc Tính và Trường
Bạn có thể truy cập và thay đổi giá trị của các thuộc tính và trường của một đối tượng tại runtime.
Truy cập và thay đổi thuộc tính:
class Program
{
static void Main()
{
Type personType = typeof(Person);
object personInstance = Activator.CreateInstance(personType, "John Doe", 30);
// Truy cập và thay đổi giá trị của thuộc tính Name
PropertyInfo nameProperty = personType.GetProperty("Name");
nameProperty.SetValue(personInstance, "Jane Doe");
// Gọi lại phương thức PrintInfo để kiểm tra thay đổi
MethodInfo printInfoMethod = personType.GetMethod("PrintInfo");
printInfoMethod.Invoke(personInstance, null);
}
}
Truy cập và thay đổi trường:
class Program
{
static void Main()
{
Type personType = typeof(Person);
object personInstance = Activator.CreateInstance(personType, "John Doe", 30);
// Truy cập và thay đổi giá trị của trường age (trường private)
FieldInfo ageField = personType.GetField("age", BindingFlags.NonPublic | BindingFlags.Instance);
ageField.SetValue(personInstance, 35);
// Gọi lại phương thức PrintInfo để kiểm tra thay đổi
MethodInfo printInfoMethod = personType.GetMethod("PrintInfo");
printInfoMethod.Invoke(personInstance, null);
}
}
Tổng Kết
- Reflection là một công cụ mạnh mẽ trong C# cho phép bạn truy cập và thao tác với các thành phần của đối tượng tại runtime.
- Truy cập thông tin lớp: Sử dụng các phương thức như
GetProperties
,GetMethods
, vàGetFields
để lấy thông tin về các thuộc tính, phương thức, và trường. - Tạo đối tượng và gọi phương thức: Sử dụng
Activator.CreateInstance
để tạo đối tượng vàMethodInfo.Invoke
để gọi phương thức. - Truy cập và thay đổi giá trị: Sử dụng
PropertyInfo.SetValue
vàFieldInfo.SetValue
để thay đổi giá trị của thuộc tính và trường.
Reflection rất hữu ích trong các kịch bản như lập trình phụ thuộc, viết các công cụ chung, và khi bạn cần làm việc với các đối tượng một cách động mà không biết trước kiểu của chúng. Tuy nhiên, cần sử dụng reflection cẩn thận vì nó có thể ảnh hưởng đến hiệu suất và độ an toàn của mã.
Comments