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 thông qua 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
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 sở trừu tượng
System.Attribute
. Các lớp đặc tính tùy biến phải
public
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 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 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
System.AttributeTargets
, chỉ định
phần tử chương trình đặc tính s
có hiệu lực trên đó.
AttributeTargets.All
AllowMultiple
được nêu
tên
Đặc tính 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 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
dụ dưới đây trình bày cách tạo một đặc tính tùy biến tên
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 vị t chứa tên tác giả.
Company
thuộc tính công khai (có thể dùng làm đối sô được nêu tên),
Name
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 {
112
Chương 3: Miền ứng dụng, cơ chế phản chiếu, và siêu dữ liệu
private string company; // Công ty của tác giả
private string name; // Tên tác giả
// Khai báo phương thức khởi dựng công khai.
public AuthorAttribute(string name) {
this.name = name;
company = "";
}
// Khai báo thuộc tính Company có quyền set/get.
public string Company {
get { return company; }
set { company = value; }
}
// Khai báo thuộc tính Name chỉ-đọc.
public string Name{
get { return name;}
}
}
Dưới đây là cách sử dụng
AuthorAttribute
:
// Khai báo Square Nguyen là tác giả của assembly.
[assembly:Author("Square Nguyen", Company = "Goldsoft Ltd.")]
// Khai báo Square Nguyen là tác giả của lớp.
[Author("Square Nguyen", Company = "Goldsoft Ltd.")]
public class SomeClass {
§
}
// Khai báo Stephen Chow là tác giả của lớp.
[Author("Stephen Chow")]
public class SomeOtherClass {
§
113
Chương 3: Miền ứng dụng, cơ chế phản chiếu, và siêu dữ liệu
}
14.
14. S d ng c ch ph n chi u đ ki m tra ơ ế ế
S d ng c ch ph n chi u đ ki m tra ơ ế ế
các đ c tính c a m t ph n t ch ng trình ươ
các đ c tính c a m t ph n t ch ng trình ươ
Bạn muốn sử dụng chế phản chiếu để kiểm tra các đặc tính tùy biến đã được
áp dụng cho một phần tử chương trình.
Gọi phương thức
GetCustomAttributes
của đối tượng dẫn xuất từ lớp
System.Reflection.MemberInfo
(đối tượng này tả phần tử chương trình cần
kiểm tra).
Tất cả các lớp tả các phần tử chương trình đều dẫn xuất từ lớp
MemberInfo
. Lớp này bao
gồm
Type
,
EventInfo
,
FieldInfo
,
PropertyInfo
,
MethodBase
.
MethodBase
thêm hai lớp
con:
ConstructorInfo
MethodInfo
. Bạn thể gọi phương thức
GetCustomAttributes
nếu
được bất đối tượng nào của các lớp này. Phương thức này sẽ trả về mảng chứa các đặc
tính tùy biến đã được áp dụng cho phần tử chương trình. Chú ý là mảng này chỉ chứa các đặc
tính tùy biến chứ không chứa các đặc tính sẵn trong thư viện các lớp sở của .NET
Framework.
Phương thức
GetCustomAttributes
hai dạng thức. Dạng đầu tiên nhận một đối số
bool
để
xác định phương thức này có trả về các đặc tính được thừa kế từ các lớp cha hay không. Dạng
thứ hai nhận thêm một đối số
Type
vai trò như một bộ lọc, kết quả trả về các đặc tính
thuộc kiểu đã được chỉ định bởi
Type
.
dụ sau sử dụng đặc tính tùy biến
AuthorAttribute
đã được khai báo trong mục 3.13 áp
dụng vào lớp
GetCustomAttributesExample
. Phương thức
Main
sẽ gọi phương thức
GetCustomAttributes
, lọc c đặc tính để kết quả trả về ch các thể hiện của
AuthorAttribute
. Bạn thể thực hiện ép kiểu an toàn các đặc tính này về tham chiếu
AuthorAttribute
truy xuất các thành viên của chúng không cần sử dụng chế phản
chiếu.
using System;
[Author("Stephen Chau")]
[Author("Square Nguyen", Company = "Goldsoft Ltd.")]
public class GetCustomAttributesExample {
public static void Main() {
// Lấy đối tượng Type cho chính lớp này.
Type type = typeof(GetCustomAttributesExample);
// Lấy các đặc tính cho kiểu này. Sử dụng bộ lọc để
// kết quả trả về chỉ có các thể hiện của AuthorAttribute.
114
Chương 3: Miền ứng dụng, cơ chế phản chiếu, và siêu dữ liệu
object[] attrs =
type.GetCustomAttributes(typeof(AuthorAttribute), true);
// Liệt kê các đặc tính.
foreach (AuthorAttribute a in attrs) {
Console.WriteLine(a.Name + ", " + a.Company);
}
// Nhấn Enter để kết thúc.
Console.ReadLine();
}
}
4
115
Chương 4:TIỂU TRÌNH, TIẾN TRÌNH, VÀ SỰ ĐỒNG BỘ