Tải bản đầy đủ (.pdf) (4 trang)

Miền ứng dụng ,cơ chế phản chiếu và siêu dữ liệu phần cuối

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (162 KB, 4 trang )

#
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.
1.1
Tạo một đặc tính tùy biến
V
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
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 {

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 {
§
}
1.2

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
V
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ú
ý 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();
}
}


×