Sử dụng System.AttributeUsageAttribute để định nghĩa: • Những phần tử chương trình nào là đích của đặc tính • Bạn có thể áp dụng nhiều thể hiện của đặc tính cho một phần tử chương trì
Trang 1# Lớp System.Activator cung cấp hai phương thức tĩnh CreateInstance và CreateInstanceFrom dùng để tạo các đối tượng dựa trên đối tượng Type hay
chuỗi chứa tên kiểu Xem tài liệu NET Framework SDK để biết thêm chi tiết
V Bạn cần tạo ra một đặc tính theo ý bạn
# Tạo một lớp dẫn xuất từ lớp cơ sở trừu tượng System.Attribute Hiện thực các phương thức khởi dựng, các trường, và các thuộc tính để cho phép người dùng cấu hình đặc tính Sử dụng System.AttributeUsageAttribute để định nghĩa:
• Những phần tử chương trình nào là đích của đặc tính
• Bạn có thể áp dụng nhiều thể hiện của đặc tính cho một phần tử chương
trình hay không
• Đặ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, hãy á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
Trang 2ValidOn 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 {
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 {
Trang 3get { 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 {
§
}
các đặc tính của một phần tử chương trình
V Bạn muốn sử dụng cơ 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 mô tả phần tử chương trình cần kiểm tra)
Tất cả các lớp mô 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, và MethodBase MethodBase có thêm hai lớp con: ConstructorInfo và MethodInfo Bạn có thể gọi phương thức GetCustomAttributes nếu có được bất kì đố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ú
Trang 4ý 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 có sẵn trong
thư viện các lớp cơ sở của NET Framework
Phương thức GetCustomAttributes có 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 có vai trò như một bộ lọc, kết quả trả về
là các đặc tính thuộc kiểu đã được chỉ định bởi Type
Ví dụ sau sử dụng đặc tính tùy biến AuthorAttribute đã được khai báo trong mục 3.13 và
áp dụng nó vào lớp GetCustomAttributesExample Phương thức Main sẽ gọi phương thức GetCustomAttributes, lọc các đặc tính để kết quả trả về chỉ có các thể hiện của AuthorAttribute Bạn có thể thực hiện ép kiểu an toàn các đặc tính này về tham chiếu AuthorAttribute và truy xuất các thành viên của chúng mà không cần sử dụng cơ 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
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();
}
}