
C# và các lớp cơ sở
Reflection – Phần 2
Lớp assembly
Lớp assembly được định nghĩa trong namespace System.Reflection , cho
phép ta truy xuất vào các metadata trong 1 assembly. Nó cũng chứa những
phương thức cho phép ta thực thi 1 assembly,. Như lớp Type, nó chứa 1 số
lớn những phương thức và thuộc tính.ta không thể xem xét hết.thay vào đó
ta sẽ chỉ tìm hiểu một sồ phưong thức thuộc tính cần thiết.
trước khi làm bất cứ điều gì với 1 thể hiện assembly ta cần tải nó vào tiến
trình chạy.ta làm điều này bằng cách gọi phương thức static assembly.Load()
và assembly.LoadFrom(). điểm khác giữa 2 phương thức là load() lấy tên
của assembly,mà phải là assembly được tham chiếu từ assembly đang thực
thi đương thời( nói cách khác nó là assembly mà ta tham chiếu khi biên dịch

dự án lần đầu.)trong khi loadfrom() lấy đường dẫn của assembly,mà có thể
là assembly bất kì được trình bày trong hệ thống :
Assembly assembly1 = Assembly.Load("SomeAssembly");
Assembly assembly2 = Assembly.LoadFrom
(@"C:\My Projects\GroovySoftware\SomeOtherAssembly");
Có 1 số cách overload khác của 2 phương thức này,mà thêm thông tin bảo
mật.mỗi lần ta nạp 1 assembly,ta có thể dùng những thuộc tính khác trên nó
để tìm, ví dụ tên đầu đủ của nó :
string name = assembly1.FullName;
Xem xét các kiểu được định nghĩa trong 1 assembly
1 khía cạnh hay của lớp assembly là nó cho phép ta lấy chi tiết tất cả các
kiểu mà được định nghĩa trong assembly tương ứng.ta đơn giản gọi
assembly.getTypes() ,trả về 1 mảng System.Type tham chiếu chứa tất cả các
kiểu. ta có thể thao tác những tham chiếu kiểu này như đối tượng Type dùng
tác tử typeof hoặc Object.Gettype():
Type[] types = theassembly.GetTypes();
foreach(Type definedType in types)
DoSomethingWith(definedType);

Các thuộc tính tuỳ chọn.
Các phương thức ta dùng để tìm những thuộc tính tuỳ chọn được định nghĩa
trên 1 assembly hoặc trên kiểu tuỳ thuộc vào kiểu của đối tượng đi kèm.nếu
ta muốn tìm những thuộc tính tuỳ chọn đi kèm với 1 assembly ,ta cần gọi
phương thức static của lớp attribute, GetCustomAttributes() truyền 1 tham
chiếu đến assembly:
Attribute [] definedAttributes =
Attribute.GetCustomAttributes(assembly1);
// assembly1 là 1 đối tưọng assembly
GetCustomAttributes() đưọc dùng để lấy các thuộc tính của assembly, có vài
overload : nếu ta gọi không có đặc tả thông số thì nó trả về tất cả các thuộc
tính tuỳ chọn được điịnh nghĩa trong assembly đó.ta cũng có thể gọi nó bằng
cách chỉ định thông số thứ hai, là 1 đối tưọng Type chỉ định lớp thuộc tính
.trong trường hợp này GetCustomAttributes() trả về 1 mảng bao gồm tất cả
các thuộc tính trình bày của lớp đó.ta sẽ dùng overload này trong ví dụ
WhatsNewAttributes.để tìm các thuộc tính SupportsWhatsNew có được
trình bày trong assembly hay không.để làm điều này ta gọi
GetCustomAttributes() truyền 1 tham chiếu đến assembly ,và kiểu thuộc tính

SupportWhatsNewAttribute .nếu thuộc tính này được trình bày , ta có 1
mảng chứa tất cả các thể hiện của nó.nếu không có trả về null:
Attribute supportsAttribute =
Attribute.GetCustomAttributes(assembly1,
typeof(SupportsWhatsNewAttribute));
Lưu ý tất cả các attribute được lưu như các tham chiếu attribute.nếu ta muốn
gọi bất kì phương thức hay thuộc tính nào mà ta đã định nghĩa trong
attribute,thì ta sẽ cần ép kiểu những tham chiếu đó tường minh thành những
lớp attribute tuỳ chọn có liên quan.ta có thể lấy chi tiết của các attribute tuỳ
chọn mà đi kèm với 1 kiểu dữ liệu đã cho bằng cách gọi overload khác của
assembly.GetCustomAttributes(), lần này truyền 1 tham chiếu Type mà mô
tả kiểu mà ta muốn để lưu bất kì attribute đi kèm.mặt khác nếu ta muốn lấy
những attribute mà đi kèm với phương thức,hàm dựng,trường.. thì ta cần gọi
GetCustomAttributes() mà là thành viên của 1 trong những lớp
MethodInfo,ConstructorInfo, FieldInfo ...phần này nằm ngoài nội dung của
chương.
Hoàn chỉnh ví dụ WhatsNewAttributes
Ta có thể hoàn chỉnh ví dụ này bằng cách viết thêm assembly cuối cùng
trong ví dụ assembly LookUpWhatsNew. phần này của ứng dụng là 1 ứng

dụng console. tuy nhiên ,nó cần tham chiếu 2 assembly khác . mặc dù ta sắp
viết 1 ưng dụng dòng lệnh, nhưng ta sẽ làm theo ví dụ TypeView trước trình
bày kết quả trong 1 message box.
tập tin được gọi LookUpWhatsNew.cs và lệnh để biên dịch nó là :
csc /reference:WhatsNewAttributes.dll /reference:VectorClassembly.dll
LookUpWhatsNew.cs
Trong phần mã của tập tin này ,đầu tiên ta chỉ định các namespace ta muốn
dùng, trong đó có system.Text vì ta cần sử dụng 1 đối tượng Stringbuilder
lần nữa:
using System;
using System.Reflection;
using System.Windows.Forms;
using System.Text;
using Wrox.ProCSharp.VectorClassembly;
using Wrox.ProCSharp.WhatsNewAttributes;
namespace Wrox.ProCSharp.LookUpWhatsNew
{