在命令行下編譯ClassRef.cs,執行ClassRef程序,程序提示"請輸入所檢測的類(lèi)型名稱(chēng):",輸入"ClassA",運行結果如圖7.9所示。
主程序首先進(jìn)入一個(gè)不限次數的while循環(huán),循環(huán)中首先判斷輸入值是否為"quit"。如果輸入為"quit"則跳出循環(huán),否則將輸入值當做類(lèi)型名稱(chēng)字符串傳遞給Type類(lèi)的GetType()方法,獲取Type對象的引用tp,并再次傳遞給ClassB的Ref()方法。執行完Ref()方法后,程序將繼續循環(huán),提示"請輸入所檢測的類(lèi)型名稱(chēng):"直到用戶(hù)輸入"quit"為止。如圖7.9所示,輸入"ClassA"后,程序直接輸出了 ClassA類(lèi)的細節信息。再次輸入"ClassB",程序輸出ClassB類(lèi)的細節信息,運行結果如圖7.10所示。
圖7.9 反射ClassA類(lèi)型的信息
圖7.10 反射ClassB類(lèi)型的信息
在信息輸出的最后一行,程序正確判斷出ClassB類(lèi)不實(shí)現任何接口類(lèi)型,而在圖7.9中,則輸出了ClassA類(lèi)所支持的接口類(lèi)型列表。這些功能的完成代碼如下所示:
+展開(kāi)-C#
Type[] Itp = tp.GetInterfaces();
if (Itp.Length != 0)
{
foreach (Type t in Itp)
{
Console.WriteLine("{0}實(shí)現的接口類(lèi)型->{1}", FullName, t.FullName);
}
}
else
{
Console.WriteLine("{0}不實(shí)現的任何接口類(lèi)型", FullName);
}
以上代碼,調用tp對象的GetInterfaces()方法,可返回該類(lèi)型所實(shí)現的接口數組。有一點(diǎn)需要注意,所返回的接口類(lèi)型是Type類(lèi)型的對象。繼續輸入"IClassA",運行結果如圖7.11所示。
圖7.11 反射IClassA類(lèi)型的信息
IClassA是自定義的接口類(lèi)型,繼承于IClass接口,而不是實(shí)現IClass接口,這里需要注意:.NET所提供的基類(lèi)庫也可以用于反射。最后輸入"System.Byte",運行結果如圖7.12所示。
圖7.12 反射System.Byte類(lèi)型的信息
程序輸出了基類(lèi)庫中System.Byte類(lèi)的詳細信息。
解析
類(lèi)似于獲取指定類(lèi)型的方法細節信息,同樣的方法可以獲取指定類(lèi)型自身細節信息。當獲取MyClass類(lèi)型的某些特征時(shí),方法如以下代碼所示:
+展開(kāi)
-C#
using System;
Type tp = System.Type.GetType("MyClass", false, false);
string FullName = tp.FullName;
Console.WriteLine("這個(gè)類(lèi)型的全飾名稱(chēng)是{0}", FullName);
Console.WriteLine("{0}是接口類(lèi)型嗎?->{1}", FullName, tp.IsInterface);
以上代碼中,通過(guò)讀取指定類(lèi)型的Type對象屬性,可獲得類(lèi)型的特征。除了屬性,還可以調用其方法返回集合,獲取MyClass類(lèi)型所有成員的方法,如以下代碼所示:
+展開(kāi)-C#
using System;
using System.Reflection;
Type tp = System.Type.GetType("MyClass", false, false);
MemberInfo[] mi = tp.GetMembers();
以上代碼中,調用tp對象的GetMembers()方法返回一個(gè)數組,數組子項的類(lèi)型為MemberInfo,即所有成員的信息。
注意:MemberInfo類(lèi)是在System.Reflection命名空間下。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。