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

