C# và các lớp cơ sở
Reflection – Phần 2
Lớp assembly
Lp assembly được định nghĩa trong namespace System.Reflection , cho
phép ta truy xuất vào các metadata trong 1 assembly. cũng chứa những
phương thức cho phép ta thực thi 1 assembly,. Như lớp Type, chứa 1 số
ln 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 hiu một sồ phưong thức thuộc tính cần thiết.
trước khi làm bất cđiu gì với 1 thể hiện assembly ta cần tải vào tiến
trình chạy.ta làm điều này bng cách gi phương thức static assembly.Load()
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 assembly được tham chiếu từ assembly đang thực
thi đương thời( nói cách khác là assembly 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");
1 scách overload khác của 2 phương thức này,tm thông tin bảo
mật.mỗi lần ta nạp 1 assembly,ta thể dùng những thuộc tính khác trên
để tìm, ví dn đầu đủ của :
string name = assembly1.FullName;
Xem xét các kiu được định nghĩa trong 1 assembly
1 khía cạnh hay của lớp assembly là nó cho phép ta ly chi tiết tất cả các
kiểu được định nghĩa trong assembly tương ứng.ta đơn giản gọi
assembly.getTypes() ,trvề 1 mảng System.Type tham chiếu chứa tất cc
kiểu. ta thể thao tác những tham chiếu kiu 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 để m nhng 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 nhng 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() truyn 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 tả thông số thì trvề tất 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 sthứ hai, 1 đối tưọng Type chỉ định lớp thuộc tính
.trong trường hợp này GetCustomAttributes() trvề 1 mảng bao gồm tất c
các thuộc tính trình y của lớp đó.ta sẽ dùng overload y trong d
WhatsNewAttributes.để tìm các thuộc tính SupportsWhatsNew được
trình y trong assembly hay không.để làm điều này ta gọi
GetCustomAttributes() truyn 1 tham chiếu đến assembly ,và kiu thuộc tính
SupportWhatsNewAttribute .nếu thuộc tính y được trình y , ta 1
mảng chứa tất cả các thể hin 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 ta đã định nghĩa trong
attribute,tta scầ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ó thlấy chi tiết của các attribute tu
chọn đi 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 truyn 1 tham chiếu Type mà
tkiểu mà ta muốn để lưu bất kì attribute đi m.mặt kc nếu ta muốn lấy
những attribute mà đi m với phương thức,hàm dựng,trường.. thì ta cn gọi
GetCustomAttributes() thành viên của 1 trong những lớp
MethodInfo,ConstructorInfo, FieldInfo ...phn này nm ngoài nội dung của
chương.
Hoàn chỉnh ví dWhatsNewAttributes
Ta th hoàn chỉnh dụ này bng ch viết thêm assembly cui cùng
trong dassembly LookUpWhatsNew. phn này của ứng dụng là 1 ứng
dụng console. tuy nhiên ,nó cn tham chiếu 2 assembly khác . mặc dù ta sp
viết 1 ưng dụng dòng lệnh, nhưng ta sẽ làm theo ví dTypeView 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 y u tiên ta chđịnh các namespace ta mun
dùng, trong đó có system.Text vì ta cn sdụng 1 đối tượng Stringbuilder
ln 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
{