反射學習系列1 反射入門

2021-09-05 19:34:31 字數 2316 閱讀 5840

反射學習系列目錄

反射學習系列1-反射入門

反射學習系列2-特性(attribute)

反射學習系列3-反射例項應用

作者

reflection,中文翻譯為反射。這是.net中獲取執行時型別資訊的方式,.net的應用程式由幾個部分:『程式集(assembly)』、『模組(module)』、『型別(class)』組成,而反射提供一種程式設計的方式,讓程式設計師可以在程式執行期獲得這幾個組成部分的相關資訊,例如:assembly類可以獲得正在執行的裝配件資訊,也可以動態的載入裝配件,以及在裝配件中查詢型別資訊,並建立該型別的例項。type類可以獲得物件的型別資訊,此資訊包含物件的所有要素:方法、構造器、屬性等等,通過type類可以得到這些要素的資訊,並且呼叫之。methodinfo包含方法的資訊,通過這個類可以得到方法的名稱、引數、返回值等,並且可以呼叫之。諸如此類,還有fieldinfo、eventinfo等等,這些類都包含在system.reflection命名空間下。

一、type類於獲取型別資訊

system.type 類對於反射起著核心的作用。當反射請求載入的型別時,公共語言執行庫將為它建立乙個 type。您可以使用 type 物件的方法、字段、屬性和巢狀類來查詢有關該型別的所有資訊。

大家執行一下下面的**根據結果分析一下就能比較清楚的理解type了

namespace

class

program:"

,item.membertype,item);}}

}class

myclass

public

intmyproperty }}

二、獲取程式集元資料

assembly類定義了乙個程式集,它是乙個可重用、無版本衝突並且可自我描述的公共語言執行庫應用程式構造塊。因為程式集中是使用元資料進行自我描述的,所以我們就能通過其元資料得到程式集內部的構成。結合assembly和反射能夠獲取程式集的元資料,但是首先要將程式集裝入記憶體中。可以使用assembly類的多種靜態load方法引導程式集。

下面的程式顯示程式集的資訊

public

static

void

main()}

三、動態載入型別

早繫結是在編譯時繫結物件型別,而晚繫結是在執行時才繫結物件的型別。利用反射可以實現晚繫結,即動態載入型別,並呼叫他們的方法,下邊是msdn中的乙個例子,詳細的解釋資訊見注釋

namespace

public

class

example

public

intsamplemethod(

intx)

) executes.

", x);

returnx *

factor;

}public

static

void

main()

", assemname.name);

console.writeline(

"version: .",

assemname.version.major, assemname.version.minor);

console.writeline(

"\nassembly codebase:");

console.writeline(assem.codebase);

//從程式集眾建立乙個example例項並且用object型別的引用o指向它,同時呼叫乙個輸入引數的建構函式

object o 

=assem.createinstance(""

, false

,bindingflags.exactbinding,

null

, new

object , 

null

, null

);//

構造example類的乙個晚繫結的方法samplemethod  

methodinfo m 

=assem.gettype(""

).getmethod(

"samplemethod");

//呼叫剛才例項化好的example物件o中的samplemethod方法,傳入的引數為42

object ret 

=m.invoke(o, 

newobject );

console.writeline(

"samplemethod returned .

", ret);

console.writeline(

"\nassembly entry point:");

console.writeline(assem.entrypoint);}}

反射學習系列1 反射入門

反射學習系列目錄 反射學習系列1 反射入門 反射學習系列2 特性 attribute 反射學習系列3 反射例項應用 作者 reflection,中文翻譯為反射。這是.net中獲取執行時型別資訊的方式,net的應用程式由幾個部分 程式集 assembly 模組 module 型別 class 組成,而...

反射學習系列

您清晰的元件化目標是否因在庫間共享過多型別資訊而落空?或許您需要高效的強型別化資料儲存,但如果每次物件模型發展後都需要更新您的資料庫架構,那會耗費很大成本,所以您更願意在執行時推斷出其型別架構嗎?您需要交付能接受任意使用者物件的元件,並以某種智慧型化的方式處理它們嗎?您希望庫的調方者能以程式設計方式...

反射學習系列3 反射例項應用

反射學習系列目錄 反射學習系列1 反射入門 反射學習系列2 特性 attribute 反射學習系列3 反射例項應用 作者例子這個東西其實挺難弄得,弄個簡單的,雖然能說明問題但卻容易讓人覺得沒實用價值,弄個有實用價值卻又往往牽扯很多別的技術甚至牽扯很多業務邏輯,看起來很複雜很難懂。在這裡我盡量追求幾個...