Tài liệu C# và Các Lớp Đối Tượng part 6 - Pdf 10


Reflection
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

ệ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()
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 )
FieldInfo GetField(), GetFields()
InterfaceInfo GetInterface(), GetInterfaces()
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

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

đị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);

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 trình
bày trong assembly hay không.để làm điều này ta gọi GetCustomAttributes() truyền 1
tham chiếu đến assembly ,và kiểu thuộc tính 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ì

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

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);
}
}
}

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)


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status