反射技術在多數.net程式中不會被使用,但是它的確是非常重要的技術,在很多應用程式中有著不可替代的作用。.net的應用程式體系分為以下4個層次:程式集(assembly)、模組(module)、型別(class)和型別成員(member),反射技術可以在程式執行時獲取這4個層次的元資料資訊。只要掌握了反射技術實現的基本原理,就可以輕鬆解決各種形式的反射技術問題。
說明:應用程式域是程式集層次之上的更大的容器,乙個應用程式域可以裝載多個程式集,本章暫不討論。
面試例題6:如何使用反射技術獲取指定型別中方法的完整資訊?
考點:反射技術的基本知識以及獲取type物件的方式,了解system.reflection命名空間下的型別。
出現頻率:★★★
解答
使用反射技術可以輕鬆獲取指定型別方法的完整資訊,首先獲取指定型別的type物件,然後通過type物件的成員獲取型別中方法的元資料資訊。本題定義了classa類,定義了2個方法,並重寫了tostring()方法,由於該類隱式繼承於system.object類,所以該類還含有繼承於基類的多個方法。在主程式通過反射獲取方法資訊時,無法被type物件獲取,這是因為methoda()方法不是公共成員,在目錄下新建乙個程式檔案,並命名為methodref.cs,編寫**如**7.6所示。
**7.6 反射獲取方法資訊:methodref.cs
+展開
-c#using
system;
//匯入相應的命名空間
using
system.reflection;
class
methodref
方法】"
, s.name);
console.write(
"方法所屬類名稱:【】"
, s.declaringtype);
console.writeline(
"/t方法是否為建構函式:【】"
, s.isconstructor);
console.write(
"方法是否為public成員:【】"
, s.ispublic);
console.writeline(
"/t方法是否為internal成員:【】"
, s.isassembly);
console.write(
"方法是否為protected成員:【】"
, s.isfamily);
console.writeline(
"/t方法是否為private成員:【】"
, s.isprivate);
console.write(
"方法是否為泛型方法:【】"
, s.isgenericmethod);
console.writeline(
"/t方法是否為靜態方法:【】"
, s.isstatic);
console.write(
"方法是否為virtual方法:【】"
, s.isvirtual);
console.writeline(
"/t方法返回型別為:【】"
, s.returntype);
//呼叫s的getparameters方法,返回parameterinfo型別陣列
//遍歷陣列的parameterinfo型別子項
foreach
(parameterinfo pms
ins.getparameters())
引數】------"
, pms.name);
console.write(
"引數型別:【】"
, pms.parametertype);
console.writeline(
"/t引數位置:【】"
, pms.position); }
} }
}class
classa
//定義public許可權的methodb方法
public
void
methodb(
inti, string
j)
和",i,j); }
//重寫tostring方法
public
override
string
tostring()
} 在命令列下編譯methodref.cs,執行methodref程式,執行結果如圖7.8所示。
本程式通過system.type類的gettype()方法獲取classa類的type物件tp,接著進行2層foreach語句巢狀,遍歷方法的詳細資訊。當tp物件通過getmethods()方法返回ma陣列後,通過外層foreach語句遍歷並輸出該陣列的methodinfo型別子項屬性,即每個方法的屬性。在內層foreach語句結構中, ma陣列子項呼叫getparameters()方法返回的陣列進行再次遍歷,即可輸出每個方法的引數詳細資訊(每個引數對應乙個 parameterinfo型別物件)。
C 反射教程(4)
展開 c using system 匯入相應的命名空間 using system.reflection using system.io class 宣告assembly型別物件am assembly am try 捕獲檔案未找到異常 catch filenotfoundexception e e.m...
反射專題1
1 首先,先解決乙個問題,完成乙個物件的拷貝。2 獲取class 型別的物件方法 1 通過getclass 方法,如 person類 reflection 類 輸出 可見某個型別的多個物件在共享乙個class型別物件。2 通過class.forname string name 方法,如 在原來per...
反射理解1
web框架的核心在於反射。這需要操作xml檔案和class物件來實現。反射應用於在編譯時無法知道傳遞過來的引數是什麼物件,只有在執行時才知道的情況下。通過反射能獲取已裝載類的屬性 方法 構造方法等資訊。它將程式 訪問裝載到jvm中的類的內部資訊。class物件 獲取class物件的方法 1 通過cl...