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 1

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

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

Reflection là 1 thuật ngữ bao phủ 1 lớp cơ sở khác của .NET mà cho phép ta tìm ra thông tin về các kiểu trong chương trình. hầu hết những lớp này nằm trong namespace System.Reflection, và có 1 số lớn các lớp khác trong namespace này. trong phần này ta sẽ tìm hiểu lớp system.Type , mà cho phép ta truy nhập thông tin liên quan đến việc định nghĩa bất kì kiểu dữ liệu nào được cho.tiếp theo ta sẽ tìm hiểu lớp System.Reflection.assembly mà cho phép ta truy xuất thông tin về assembly được cho,...

Chủ đề:
Lưu

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

  1. C# và các lớp cơ sở Reflection – Phần 1 Reflection là 1 thuật ngữ bao phủ 1 lớp cơ sở khác của .NET mà cho phép ta tìm ra thông tin về các kiểu trong chương trình. hầu hết những lớp này nằm trong namespace System.Reflection, và có 1 số lớn các lớp khác trong namespace này. trong phần này ta sẽ tìm hiểu lớp system.Type , mà cho phép ta truy nhập thông tin liên quan đến việc định nghĩa bất kì kiểu dữ liệu nào được cho.tiếp theo ta sẽ tìm hiểu lớp System.Reflection.assembly mà cho phép ta truy xuất thông tin về assembly được cho, hoặc tải assembly đó vào trong chương trình của ta.cuối cùng ta sẽ xét ví dụ WhatsNewAttributes Lớp System.Type Ta đã dùng lớp Type 1 số lần để lấy tên của 1 kiểu : Type t = typeof(double)
  2. Mặc dù ta cho rằng type là 1 lớp nhưng thực sự nó là 1 lớp cơ sở trừu tượng, bất cứ khi nào ta khởi tạo 1 đối tượng type ta thực sự khởi tạo 1 lớp dẫn xuất của type.type có 1 lớp dẫn xuất đáp ứng mỗi kiểu dữ liệu.có 3 cách lấy 1 tham chiếu Type mà chuyển cho kiểu dữ liệu bất kì: - Dùng tác tử typeof. tác tử này lấy tên của kiểu như là thông số . - Dùng phương thức Gettype() , mà tất cả các lớp kế thừa từ System.Object: double d = 10;Type t = d.GetType(); Gettype() hữu ích khi ta có 1 tham chiếu đối tượng và không chắc đối tượng thực sự là thể hiện của lớp nào - Ta cũng có thể gọi phương thức static của lớp type ,getType(): Type t = Type.GetType("System.Double"); Các thuộc tính của Type 1. 1 số thuộc tính lấy chuỗi chứa các tên khác nhau kết hợp với lớp : Thuộc tính Trả về tên của kiểu dữ liệu Name tên đầy đủ bao gồm cả namespace FullName
  3. Thuộc tính Trả về tên namespace của kiểu dữ liệu. Namespace 2. Có thể lấy những tham chiếu đến kiểu những đối tượng mà trình bày các lớp có liên quan : Thuộc tính Kiểu tham chiếu trả về tương ứng với kiểu cơ sở trực tiếp của kiểu này BaseType UnderlyingSystemType kiểu mà kiểu này ánh xạ trong thời gian chạy .NET 3. 1 số thuộc tính luận lý chỉ định liệu có phải là kiểu nào đó hay không ví dụ là 1 lớp hay 1 kiểu liệt kê ... những thuộc tính này bao gồm : IsAbstract, IsArray, IsClassembly,IsEnum, IsInterface, IsPointer, IsPrimitive ( 1 trong những kiểu dữ liệu bẩm sinh được định nghĩa trước), IsPublic, IsSealed, and IsValueType. Ví dụ :dùng kiểu dữ liệu bẩm sinh : Type intType = typeof(int);Console.WriteLine(intType.IsAbstract); // writes false Console.WriteLine(intType.IsClassembly); // writes false
  4. Console.WriteLine(intType.IsEnum); // writes false Console.WriteLine(intType.IsPrimitive); // writes true Console.WriteLine(intType.IsValueType); // writes true hoặc dùng lớp Vector : Type intType = typeof(Vector);Console.WriteLine(intType.IsAbstract); //writes false Console.WriteLine(intType.IsClassembly); // writes true Console.WriteLine(intType.IsEnum); // writes false Console.WriteLine(intType.IsPrimitive); // writes false Console.WriteLine(intType.IsValueType); // writes false Các phương thức : Hầu hết các phương thức của System.Type được sử dụng để chứa chi tiết các thành viên của kiểu dữ liệu tương ứng - hàm dựng ,thuộc tính,phương thức , biến cố...có nhiều phương thức nhưng tất cả chúng đều theo nền chung. ví dụ , có hai phương thức mà nhận chi tiết phương thức của kiểu dữ liệu : getmethod() và getmethods(). getmethod() trả về 1 tham chiếu đến đối tượng System.Reflection.MethodInfo mà chứa chi tiết của 1 phương thức .getmethods() trả vế 1 mảng tham chiếu. điểm khác là getmethods() trả về chi tiết của tất cả phương thức , trong khi getmethod() trả về chi tiết của chỉ
  5. một phương thức được chỉ định trong danh sách thông số.cả hai phương thức đều overloads mà lấy thêm 1 thông số , BindingFlags liệt kê giá trị chỉ định thành viên nào nên được trả về- ví dụ như trả về 1 thành viên public, 1 thành viên instance, thành viên static ... Ví dụ phương thức getmethods() không lấy thông số nào và trả về chi tiết của tất cả phương thức thành viên của kiểu dữ liệu : Type t = typeof(double); MethodInfo [] methods = t.GetMethods(); foreach (MethodInfo nextMethod in methods) { // etc. Kiểu đối tượng trả về Các phương thức (phương thức số nhiều ( có 's' ở cuối tên ) trả về 1 mảng ) ConstructorInfo GetConstructor(), GetConstructors() EventInfo GetEvent(), GetEvents() FieldInfo GetField(), GetFields() InterfaceInfo GetInterface(), GetInterfaces()
  6. Kiểu đối tượng trả về Các phương thức (phương thức số nhiều ( có 's' ở cuối tên ) trả về 1 mảng ) MemberInfo GetMember(), GetMembers() MethodInfo GetMethod(), GetMethods() PropertyInfo GetProperty(), GetProperties() Phương thức getmember() và getmembers() trả về chi tiết của bất kì hay tất cả thành viên của kiểu dữ liệu không cần biết đó là hàm dựng hay thuộc tính phương thức.. Ví dụ TypeView Qua ví dụ này ta có thể đưa ra một danh sách các thành viên của 1 kiểu dữ liệu. ta sẽ minh họa dùng Typeview cho kiểu Double , và có thể thay thế bằng các kiểu khác . typeview trình bày nhiều thông tin hơn trong console window :
  7. Hộp thông điệp sẽ trình bày tên , tên đầu đủ namespace của kiểu dữ liệu ... sau đó lặp lại xuyên suốt tất cả các thành viên thể hiện public của kiểu dữ liệu, trình bày mỗi thành viên kiểu khai báo,kiểu thành viên ( phương thức, trường,..) và tên của thành viên.Declaring type là tên của lớp mà thực sự khai báo kiểu thành viên. Để bắt đầu ta thêm vài câu lệnh using: using System; using System.Text; using System.Windows.Forms; using System.Reflection;
  8. Ta cần System.text vì ta dùng Stringbuilder để xây dựng chuỗi trình bày trong message box,và system.windoes.forms cho message box.toàn bộ mã nằm trong mainclassembly, mà có 1 vài phương thức static và 1 trường static, 1 stringbuilder gọi outputText, mà được dùng để tạo chuỗi trình bày trong message box, khai báo như sau : class MainClass { static void Main() { // modify this line to retrieve details of any // other data type Type t = typeof(double); AnalyzeType(t); MessageBox.Show(OutputText.ToString(), "Analysis of type " + t.Name); Console.ReadLine(); }
  9. Đầu tiên ta khai báo đối tưọng Type để trình bày kiểu mà ta chọn.sau đó gọi phương thức AnalyzeType(),mà lấy thông tin từ Type và dùng nó làm chuỗi xuất.cuối cùng trình bày nó trong message box. static void AnalyzeType(Type t) { AddToOutput("Type Name: " + t.Name); AddToOutput("Full Name: " + t.FullName); AddToOutput("Namespace: " + t.Namespace); Type tBase = t.BaseType; if (tBase != null) AddToOutput("Base Type:" + tBase.Name); Type tUnderlyingSystem = t.UnderlyingSystemType; if (tUnderlyingSystem != null) AddToOutput("UnderlyingSystem Type:" + tUnderlyingSystem.Name); AddToOutput("\nPUBLIC MEMBERS:"); MemberInfo [] Members = t.GetMembers(); foreach (MemberInfo NextMember in Members)
  10. { AddToOutput(NextMember.DeclaringType + " " + NextMember.MemberType + " " + NextMember.Name); } } Phương thức này gọi những thuộc tính khác nhau của đối tượng Type để lấy thông tin ta cần, liên quan đến tên , sau đó gọi Getmembers() để lấy 1 mảng đối tượng MemberInfo mà ta có thể dùng để trình bày chi tiết của mỗi phưong thức. chú ý rằng ta dùng 1 phương thức trợ giúp , AddTooutput(), để xây dựng chuỗi trình bày. static void AddToOutput(string Text) { OutputText.Append("\n" + Text); }
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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