×

Sử dụng Reflection trong C# Truy cập và thay đổi dữ liệu tại runtime

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.SetValueFieldInfo.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