111
Chương 3: Miền ứng dụng, cơ chế phản chiếu, và siêu dữ liệu
•
Đặc tính có được thừa kế bởi các kiểu dẫn xuất hay không
Đặc tính cung cấp một cơ chế tổng quát cho việc kết hợp thông tin khai báo (siêu dữ liệu) với
các phần tử chương trình. Siêu dữ liệu này nằm trong assembly đã được biên dịch, cho phép
các chương trình thu lấy nó thông qua cơ chế phản chiếu lúc thực thi (xem mục 3.14.) Các
chương trình khác, đặc biệt là CLR, sử dụng thông tin này để xác định cách thức tương tác và
quản lý các phần tử chương trình.
Để tạo một đặc tính tùy biến thì hãy dẫn xuất một lớp từ lớp cơ sở trừu tượng
System.Attribute
. Các lớp đặc tính tùy biến phải là
public
và có tên kết thúc bằng
“
Attribute
”. Một đặc tính tùy biến phải có ít nhất một phương thức khởi dựng công khai. Các
đôi sô của phương thức khởi dựng sẽ trở thành các đôi sô vị trí (positional parameter) của đặc
tính. Như với bất kỳ lớp nào khác, bạn có thể khai báo nhiều phương thức khởi dựng, cho
phép người dùng tùy chọn sử dụng các tập khác nhau của các đối sô vị trí khi áp dụng đặc
tính. Bất kỳ thuộc tính và trường đọc/ghi công khai nào do đặc tính khai báo đều trở thành đối
sô được nêu tên (named parameter).
Để điều khiển cách thức người dùng áp dụng đặc tính, hay áp dụng đặc tính
AttributeUsageAttribute
cho đặc tính tùy biến của bạn. Đặc tính
AttributeUsageAttribute
hỗ trợ một đối sô vị trí và hai đối sô được nêu tên, được mô tả trong bảng 3.3. Các giá trị mặc
định chỉ định giá trị sẽ được áp dụng cho đặc tính tùy biến của bạn nếu bạn không áp dụng
AttributeUsageAttribute
hoặc không chỉ định giá trị cho một thông số.
Bảng 3.3 Các thành viên thuộc kiểu liệt kê AttributeUsage
Thông số
Kiểu
Mô tả
Mặc định
ValidOn
vị trí
Một thành viên thuộc kiểu liệt kê
System.AttributeTargets
, chỉ định
phần tử chương trình mà đặc tính sẽ
có hiệu lực trên đó.
AttributeTargets.All
AllowMultiple
được nêu
tên
Đặc tính có thể được chỉ định nhiều
lần cho một phần tử hay không.
false
Inherited
được nêu
tên
Đặc tính có được thừa kế bởi các lớp
dẫn xuất hay các thành viên được
chép đè hay không.
true
Ví dụ dưới đây trình bày cách tạo một đặc tính tùy biến có tên là
AuthorAttribute
, cho phép
bạn xác định tên và công ty của người tạo ra lớp hay assembly.
AuthorAttribute
khai báo một
phương thức khởi dựng công khai, nhận một chuỗi chứa tên tác giả. Điều này yêu cầu người
sử dụng
AuthorAttribute
phải luôn cung cấp một đối sô vị trí chứa tên tác giả.
Company
là
thuộc tính công khai (có thể dùng làm đối sô được nêu tên),
Name
là thuộc tính chỉ-đọc (không
thể dùng làm đối sô được nêu tên).
using System;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly,
AllowMultiple = true, Inherited = false)]
public class AuthorAttribute : System.Attribute {