Tải bản đầy đủ (.pdf) (10 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (112.18 KB, 10 trang )

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)
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ề


Name tên của kiểu dữ liệu
FullName tên đầy đủ bao gồm cả namespace
Thuộc tính Trả về
Namespace tên namespace của kiểu dữ liệu.

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
BaseType kiểu cơ sở trực tiếp của kiểu này
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
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ỉ
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()
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 :

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;

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();
}
Đầ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)
{
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);
}

×