.1 Thuộc tính (attribute) tùy chọ n

Một phần của tài liệu BÀI GIẢNG TÓM TẮT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ppsx (Trang 105 - 107)

Viết thuộc tính tuỳ chọn

Để hiểu cách viết thuộc tính tùy chọn, ta cần xem trình biên dịch làm gì khi nó gặp một mục trong mã được đánh dấu với một attribute. Giả sử ta có thuộc tính khai báo như sau:

[TenTruong("SoCMND")] public string SoCMND {

get { // vv...

Như ta thấy thuộc tính SoCMND có một thuộc tính TenTruong, trình biên dịch sẽ nối chuỗi attribute với tên này thành TenTruongAttribute, sau đó tìm trong tất cả các namespace lớp có tên này. Tuy nhiên nếu ta đánh dấu một mục với một thuộc tính mà tên của nó có phần cuối là attribute thì trình biên dịch sẽ không thêm chuỗi attribute lần nữa ví dụ:

[TenTruongattribute("SoCMND")] public string SoCMND

{

// vv...

Nếu trình biên dịch không tìm thấy một lớp thuộc tính tương ứng, hoặc thấy nhưng cách mà ta dùng thuộc tính không phù hợp với thông tin trong lớp thuộc tính, thì trình biên dịch sẽ sinh ra lỗi.

Các lớp thuộc tính tuỳ chọn

Giả sử ta đã định nghĩa một thuộc tính TenTruong như sau: [AttributeUsage(AttributeTargets.Property, AllowMultiple=false,

Inherited=false)]

public class TenTruongAttribute: Attribute {

private string ten;

public TenTruongAttribute(string ten) {

this.ten = ten; }

105

Điều đầu tiên ta chú ý là lớp attribute được đánh dấu với một thuộc tính

“AttributeUsage”. AttributeUsage chỉđịnh các mục nào trong mã của chúng ta áp dụng thuộc tính tùy chọn. Thông tin này được cho bởi thông sốđầu tiên. Thông số này là một kiểu liệt kê attributeTargets. Trong ví dụ trên ta chỉđịnh thuộc tính TenTruong chỉđược áp dụng đến các thuộc tính.

Định nghĩa của kiểu liệt kê attributeTargets là: public enum attributeTargets

{ All = 0x00003FFF, Assembly = 0x00000001, Class = 0x00000004, Constructor = 0x00000020, Delegate = 0x00001000, Enum = 0x00000010, Event = 0x00000200, Field = 0x00000100, Interface = 0x00000400, Method = 0x00000040, Module = 0x00000002, Parameter = 0x00000800, Property = 0x00000080, ReturnValue = 0x00002000, Struct = 0x00000008 }

Khi áp dụng thuộc tính đến các phần tử chương trình, ta đặt thuộc tính trong ngoặc vuông ngay trước phần tử. Một thuộc tính có thểđược áp dụng đến một Assembly nhưng cần được đánh dấu với từ khoá Assembly:

[assembly: SomeAssemblyattribute(Parameters)]

Để kết hợp nhiều kiểu khác nhau trên một phần tử nào đó, ta viết như sau:

[attributeUsage(attributeTargets.Property | attributeTargets.Field, AllowMultiple=false,

Inherited=false)]

public class TenTruongattribute: attribute

Ta cũng có thể dùng attributeTargets.All để áp dụng thuộc tính cho tất cả các trường hợp. Thuộc tính attributeUsage còn chứa hai thông số khác là AllowMultiple and Inherited, chỉđịnh với cú pháp khác của <tên_thuộc_tính>=<giá_trị_thuộc_tính>. Thông số này là tuỳ chọn, thông số AllowMultiple chỉđịnh một attribute có thể áp dụng nhiều hơn một lần đến cùng một mục. Nếu thiết đặt là false thì trình biên dịch sẽ

thông báo lỗi nếu nó thấy: [TenTruong("SOCMND")] [TenTruong("SOBaoHiem")] public string SOCMND {

// vv...

Nếu thông số Inherited là true, thì một thuộc tính có thể áp dụng đến một lớp hay một giao diện cũng sẽđược áp dụng đến tất cả các lớp hay giao diện được kế thừa. Nếu

106

thuộc tính được áp dụng cho phương thức hay thuộc tính thì nó tựđộng áp dụng đến bất kì phương thức hay thuộc tính nào được khái báo override.

Đặc tả các thông số thuộc tính

Ta sẽ kiểm tra làm thế nào ta có thể chỉđịnh thông số cho thuộc tính tuỳ chọn, Khi trình biên dịch gặp lệnh:

[TenTruong("SOCMND")] public string SOCMND {

...

Nó kiểm tra thông số truyền vào attribute , trong trường hợp này là chuỗi và tìm phương thức tạo lập của thuộc tính mà nhận các thông số này, nếu thấy thì không có vấn đề gì ngược lại trình biên dịch sẽ sinh ra lỗi.

Các thông số tuỳ chọn

Ta thấy thuộc tính attributeUsage có một cú pháp cho phép thêm các giá trị vào trong thuộc tính. Cú pháp này có liên quan đến việc chỉđịnh tên của các thông sốđược chọn. Giả sử ta cập nhật lại thuộc tính SoCMND như sau:

[TenTruong("SoCMND ", ChuThich="Day la truong khoa")] public string SoCMND

{ ...

Trong trường hợp này, trình biên dịch sẽ nhận ra<tên_tham_số>= cú pháp của thông số thứ hai. Nó sẽ tìm một thuộc tính public (hoặc field) của tên đó mà nó có thể dùng

đểđặt giá trị của thông số này. Nếu ta muốn đoạn mã trên làm việc ta thêm mã sau vào TenTruongattribute:

[attributeUsage(attributeTargets.Property, AllowMultiple=false,

Inherited=false)]

public class TenTruongattribute: attribute {

private string chuthich; public string ChuThich {

...

Một phần của tài liệu BÀI GIẢNG TÓM TẮT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ppsx (Trang 105 - 107)

Tải bản đầy đủ (PDF)

(111 trang)