108
Chương 3: Miền ứng dụng, cơ chế phản chiếu, và siêu dữ liệu
Môt khi đã có đối tượng
ConstructorInfo
như mong muốn, hãy gọi phương thức
Invoke
của
nó. Bạn phải cung cấp một mảng chứa các đối số mà bạn muốn truyền cho phương thức khởi
dựng. Phương thức
Invoke
sẽ tạo đối tượng mới và trả về một tham chiếu đến đối tượng đó
(bạn phải ép về kiểu phù hợp). Dưới đây là đoạn mã trình bày cách tạo một đối tượng
System.Text.StringBuilder
, chỉ định nội dung ban đầu cho
StringBuilder
và sức chứa của
nó.
// Thu lấy đối tượng Type cho lớp StringBuilder.
Type type = typeof(System.Text.StringBuilder);
// Tạo Type[] chứa các đối tượng Type cho mỗi đối số
// của phương thức khởi dựng (một chuỗi và một số nguyên).
Type[] argTypes = new Type[] {typeof(System.String),
typeof(System.Int32)};
// Thu lấy đối tượng ConstructorInfo.
ConstructorInfo cInfo = type.GetConstructor(argTypes);
// Tạo object[] chứa các đối số cho phương thức khởi dựng.
object[] argVals = new object[] {"Some string", 30};
// Tạo đối tượng và ép nó về kiểu StringBuilder.
StringBuilder sb = (StringBuilder)cInfo.Invoke(argVals);
Chức năng phản chiếu thường được sử dụng để hiện thực các factory. Trong đó, bạn sử dụng
cơ chế phản chiếu để thể hiện hóa các lớp thừa kế một lớp cơ sở phổ biến hay hiện thực một
giao diện phổ biến. Thông thường, cả lớp cơ sở chung và giao diện chung đều được sử dụng.
Lớp cơ sở trừu tượng sẽ hiện thực giao diện và bất kỳ chức năng chung nào, sau đó mỗi hiện
thực cụ thê sẽ thừa kế lớp cơ sở.
Không có cơ chế nào để khai báo rằng mỗi lớp cụ thê phải hiện thực các phương thức khởi
dựng với các chữ ký cụ thể. Nếu muốn người khác (hãng thứ ba) hiện thực các lớp cụ thê thì
bạn phải chỉ rõ (trong tài liệu hướng dẫn) chữ ký của phương thức khởi dựng mà factory của
bạn gọi. Cách thông thường để tránh vấn đề này là sử dụng phương thức khởi dựng mặc định
(không có đối số), sau đó cấu hình đối tượng bằng phương thức và thuộc tính. Ví dụ dưới đây
sẽ hiện thực một factory dùng để tạo các đối tượng có hiện thực giao diện
IPlugin
.
using System;
using System.Reflection;
// Giao diện chung mà tất cả các plug-in phải hiện thực.
public interface IPlugin {
string Description { get; set; }