C 反射教程(1)

2021-05-24 05:04:31 字數 2483 閱讀 9564

反射技術在多數.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...