×

Thuộc Tính Trong C# Định nghĩa, Áp Dụng và Sử Dụng Reflection

Thuộc tính (attributes) trong C# cho phép bạn thêm metadata vào các thành phần của chương trình như lớp, phương thức, thuộc tính, và nhiều hơn nữa. Metadata này có thể được sử dụng để kiểm soát hành vi của chương trình tại runtime hoặc để cung cấp thông tin bổ sung cho công cụ và trình biên dịch.

1. Định nghĩa thuộc tính

Để định nghĩa một thuộc tính tùy chỉnh, bạn cần tạo một lớp kế thừa từ System.Attribute. Ví dụ:

using System;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyCustomAttribute : Attribute
{
    public string Description { get; }
    public int Version { get; }

    public MyCustomAttribute(string description, int version)
    {
        Description = description;
        Version = version;
    }
}
  • AttributeUsage xác định những thành phần nào có thể được áp dụng thuộc tính này (class, method, etc.).
  • Các thuộc tính của MyCustomAttribute như DescriptionVersion được thiết lập thông qua constructor.

2. Áp dụng thuộc tính

Bạn có thể áp dụng thuộc tính tùy chỉnh của mình vào các thành phần của chương trình:

[MyCustomAttribute("This is a custom attribute", 1)]
public class MyClass
{
    [MyCustomAttribute("This is a method with custom attribute", 2)]
    public void MyMethod()
    {
        Console.WriteLine("Hello, World!");
    }
}

3. Sử dụng thuộc tính

Để truy cập và sử dụng các thuộc tính đã áp dụng, bạn có thể sử dụng Reflection:

using System;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        Type type = typeof(MyClass);
        
        // Lấy các thuộc tính áp dụng cho lớp
        object[] classAttributes = type.GetCustomAttributes(false);
        foreach (var attribute in classAttributes)
        {
            MyCustomAttribute myAttr = attribute as MyCustomAttribute;
            if (myAttr != null)
            {
                Console.WriteLine($"Class Attribute - Description: {myAttr.Description}, Version: {myAttr.Version}");
            }
        }

        // Lấy các thuộc tính áp dụng cho phương thức
        MethodInfo method = type.GetMethod("MyMethod");
        object[] methodAttributes = method.GetCustomAttributes(false);
        foreach (var attribute in methodAttributes)
        {
            MyCustomAttribute myAttr = attribute as MyCustomAttribute;
            if (myAttr != null)
            {
                Console.WriteLine($"Method Attribute - Description: {myAttr.Description}, Version: {myAttr.Version}");
            }
        }
    }
}

4. Các thuộc tính dựng sẵn trong C#

C# cung cấp nhiều thuộc tính dựng sẵn mà bạn có thể sử dụng ngay lập tức:

  • [Obsolete]: Đánh dấu phương thức hoặc lớp đã lỗi thời và sẽ đưa ra cảnh báo khi sử dụng.

    [Obsolete("This method is obsolete. Use NewMethod instead.")]
    public void OldMethod()
    {
        // ...
    }
    
  • [Serializable]: Đánh dấu một lớp có thể được tuần tự hóa.

    [Serializable]
    public class MySerializableClass
    {
        // ...
    }
    
  • [DllImport]: Được sử dụng trong P/Invoke để nhập một hàm từ một DLL không quản lý.

    [DllImport("user32.dll")]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
    

Tổng kết

Thuộc tính trong C# là một công cụ mạnh mẽ để thêm metadata vào các thành phần của chương trình. Bạn có thể định nghĩa thuộc tính tùy chỉnh, áp dụng chúng và sử dụng Reflection để truy xuất chúng tại runtime. C# cũng cung cấp nhiều thuộc tính dựng sẵn hữu ích để giúp bạn kiểm soát hành vi của chương trình và cải thiện mã của mình.

Comments