# 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êudữ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ảnchiế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ảnchiế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ảnchiế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(); } } . 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 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