25/05/2018, 07:39

Attributes và Reflection

Xin được nhắc lại rằng một ứng dụng .NET bao gồm mã chương trình, dữ liệu, metadata. Metadata chính là thông tin về dữ liệu mà ứng dụng sử dụng như kiểu dữ liệu, mã thực thi, assembly,… A t t r i b ut e s là cơ chế để tạo ra ...

Xin được nhắc lại rằng một ứng dụng .NET bao gồm mã chương trình, dữ liệu, metadata. Metadata chính là thông tin về dữ liệu mà ứng dụng sử dụng như kiểu dữ liệu, mã thực thi, assembly,…

Attributes là cơ chế để tạo ra metadata. Ví dụ như chỉ thị cho trình biên dịch, những dữ liệu khác liên quan đến dữ liệu, phương thức, lớp, …

Reflection là quá trình một ứng dụng đọc lại metadata của chính nó để có cách thể hiện, ứng xử thích hợp cho từng người dùng.

Một attribute là một đối tượng, trong đối tượng đó chứa một mẩu dữ liệu, mà lập trình viên muốn đính kèm với một phần tử (element) nào đó trong ứng dụng. Phần tử (element) mà lập trình viên muốn đính kèm attribute gọi là mục tiêu (target) của attribute. Ví dụ attribute:

[NoIDispatch]
    

được đính kèm với một lớp hay một giao diện để nói rằng lớp đích (target class) nên được thừa kế từ giao diện IUnknown chứ không phải thừa kế từ IDispatch.

Có 2 loại attribute:

  • Attributemcđnh: là attribute được CLR cung cấp sẵn.
  • Attribute do lập trình viên định nghĩa (customattribute)

Đích của Attribute

Mỗi attribute chỉ ảng hưởng đến một đích (target) mà nó khai báo. Đích có thể là lớp, giao diện, phương thức … Bảng sau liệt kê tất cả các đích

Các đích của attribute

Áp dụng Attribute

Lập trình viên áp dụng attribute lên mục tiêu bằng cách đặt attribute trong ngoặc vuông

[]
liền trước mục tiêu. Ví dụ attribute “Assembly” được áp dụng:
[assembly: AssemblyDelaySign(false)]
    [assembly: AssemblyKeyFile(“keyfile.snk”)]
    

Cách sau cũng tương đương với cách trên:

[assembly: AssemblyDelaySign(false), assembly: AssemblyKeyFile(“keyfile.snk”)]
    

Attribute thường dùng trong lập trình C# là “Serializable”

[serializable]
    class MySerClass
    

Attribute trên báo cho compiler biết rằng lớp MySerClasscần được bảo đảm trong việc ghi nội dung, trạng thát xuống dĩa từ hay truyền qua mạng.

Lập trình viên hoàn toàn tự do trong việc tạo ra các attribute riêng và đem sử dụng chúng vào nơi nào cảm thấy thích hợp.

Khai báo Attribute tự tạo

Đầu tiên là thừa kế một lớp từ lớp System.Attribute:

Public class XYZ : System.Attribute
    

Sau đó là báo cho compiler biết attribute này có thể đem áp dụng lên mục tiêu nào.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property,
    AllowMultiple = true)]
    

Attribute AttributeUsage”trên có mục tiêu áp dụng là Attribute

0