intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

C# và các lớp cơ sở Reflection – Phần 2

Chia sẻ: Nguyen Uyen | Ngày: | Loại File: PDF | Số trang:12

102
lượt xem
10
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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()...

Chủ đề:
Lưu

Nội dung Text: C# và các lớp cơ sở Reflection – Phần 2

  1. 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
  2. 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);
  3. 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 hay không.để làm điều này ta gọi trình bày trong assembly GetCustomAttributes() truyền 1 tham chiếu đến assembly ,và kiểu thuộc tính
  4. 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
  5. 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 {
  6. lớp chính là WhatsNewChecker, mọi phương thức đều được định nghĩa trong lớp này, gồm 2 trường static outputText chứa chuỗi xuất.backDateTo lưu ngày tháng mà ta chọn - tất cả các cập nhật được tạo vào ngày này sẽ được trình bày.. thông thường ta sẽ cho người dùng gõ ngày ,nhưng vì không muốn họ gõ sai nên ta sẽ lấy ngày 1 tháng 2 2002 làm ví dụ. class WhatsNewChecker { static StringBuilder outputText = new StringBuilder(1000); static DateTime backDateTo = new DateTime(2002, 2, 1); static void Main() { Assembly theAssembly = Assembly.Load("VectorClass"); Attribute supportsAttribute = Attribute.GetCustomAttribute( theAssembly, typeof(SupportsWhatsNewAttribute)); string Name = theAssembly.FullName; AddToMessage("Assembly: " + Name);
  7. if (supportsAttribute == null) { AddToMessage( "This assembly does not support WhatsNew attributes"); return; } else AddToMessage("Defined Types:"); Type[] types = theAssembly.GetTypes(); foreach(Type definedType in types) DisplayTypeInfo(theAssembly, definedType); MessageBox.Show(outputText.ToString(), "What\'s New since " + backDateTo.ToLongDateString()); Console.ReadLine(); } Đầu tiên main() tải assembly VectorClassembly , xác minh xem nó có thực sự được đánh dấu với attributeSupportsWhatsNew hay không.
  8. Giả sử mọi thứ đều đúng ta dùng assembly.GetTypes() để lấy mảng tất cả các kiểu trong assembly này, sau đó lặp qua chúng. trong mỗi lần lặp, ta gọi 1 phương thức mà ta viết DisplayTypeInfo(), mà thêm 1 chuỗi có liên quan, bao gồm chi tiết các thể hiện của LastModifiedAttribute, thành trường outputText. cuối cùng ta cho hiện message box chuỗi này. phương thức DisplayTypeInfo() như sau: static void DisplayTypeInfo(Assembly theAssembly, Type type) { // make sure we only pick out classes if (!(type.IsClass)) return; AddToMessage("\nclass " + type.Name); Attribute [] attribs = Attribute.GetCustomAttributes(type); if (attribs.Length == 0) AddToMessage("No changes to this class\n"); else foreach (Attribute attrib in attribs) WriteAttributeInfo(attrib);
  9. MethodInfo [] methods = type.GetMethods(); AddToMessage("CHANGES TO METHODS OF THIS CLASS:"); foreach (MethodInfo nextMethod in methods) { object [] attribs2 = nextMethod.GetCustomAttributes( typeof(LastModifiedAttribute), false); if (attribs2 != null) { AddToMessage( nextMethod.ReturnType + " " + nextMethod.Name + "()"); foreach (Attribute nextAttrib in attribs2) WriteAttributeInfo(nextAttrib); } } }
  10. Lưu ý điều đầu tiên ta làm là kiểm tra tham chiếu Type được truyền vào có thực sự là 1 lớp. bởi vì ta đã chỉ định attributeLastModified chỉ có thể dùng cho lớp hoặc các phương thức thành viên. Kế tiếp ta dùng phương thức Attribute.GetCustomAttributes() để tìm xem nếu lớp có thể hiện LastModifiedAttribute đi kèm với nó hay không.nếu có ta thêm vào chuỗi xuất.dùng phương thức trợ giúp WriteAttributeInfo(). Cuối cùng ta dùng phương thức Type.GetMethods() để lặp tất cả các phương thức thành viên của kiểu dữ liệu này, sau đó làm giống như vậy với mỗi phương thức tiếp theo. Phần mã tiếp theo thể hiện phương thức WriteAttributeInfo() tìm các chuỗi cần trình bày trong thể hiện LastModifiedAttribute , vì phương thức này nhận 1 tham chiếu attribute nên nó cần được ép kiểu thành tham chiếu LastModifiedAttribute.Sau khi xong dùng các thuộc tính mà ta đã định nghĩa trong attribute này để lấy thông số của nó . nó kiểm tra ngày của attribute trước khi thêm nó vào chuỗi được trình bày: static void WriteAttributeInfo(Attribute attrib) { LastModifiedAttribute lastModifiedAttrib = attrib as LastModifiedAttribute;
  11. if (lastModifiedAttrib == null) return; // Kiểm tra ngày tháng hợp lệ DateTime modifiedDate = lastModifiedAttrib.DateModified; if (modifiedDate < backDateTo) return; AddToMessage(" MODIFIED: " + modifiedDate.ToLongDateString() + ":"); AddToMessage(" " + lastModifiedAttrib.Changes); if (lastModifiedAttrib.Issues != null) AddToMessage(" Outstanding issues:" + lastModifiedAttrib.Issues); AddToMessage(""); } Kết quả sau khi chạy :
  12. Lưu ý rằng khi ta liệt kê các kiểu được định nghĩa trong assembly VectorClassembly ta thực sự lấy hai lớp : Vector và lớp VectorEnumerator kèm theo mà ta đã xây dựng trong phần trước.
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
3=>0