C 基礎知識回顧 反射(3)

2022-01-14 15:13:50 字數 2639 閱讀 6812

獲取type物件的建構函式:

前一篇因為篇幅問題因為篇幅太短被移除首頁,反射這一塊還有一篇「怎樣在程式集中使用反射」,

其他沒有

什麼可以寫的了,前兩篇主要是鋪墊,在實際應用中,主要是最後兩篇。其實寫完反射,

我也考慮重新把委託重新寫下,現在

想想確實太過單一和簡單了。我會把實際開發中委託的例子多寫幾個

, 以便以理解。如果這幾篇c#的基礎對您有所幫助的話,

推薦。謝謝您的支援……

好了,不廢話了,在前面例子中,由於myclass型別的物件是顯示建立的,因此使

用反射技術來呼叫myclass上的

方法沒有任何優勢--以普通的方式呼叫物件上的方法會簡單的多。但是,

如果物件是在執行時動態建立

的,反射的功能就顯示出來了。在這種情況下,需要首先獲取乙個構造函

數列表,然後再呼叫列表中的

某個建構函式,建立乙個該型別的例項。通過這種機制,可以在執行時例項

化任意型別的物件而不必在

宣告中指定。

為了獲得某個型別的建構函式,需要呼叫type物件上的getconstructors()。常用形式為:

constructorinfo getconstructors()

該方法返回乙個描述建構函式的constructorinfo物件陣列。constructorinfo中常用的

是getparamters()方法,該方法返回給定建構函式的引數列表。

一旦找到了合適的建構函式,就呼叫constructorinfo定義的invoke()方法來建立物件:

object invoke(object args)

需要傳遞給此方法的所有引數都在args中指定。如果不需要引數,args必須為null。另外,

args必須包含與引數個數相同的元素,並且實參的型別必須與形參的型別相容。invoke()方法返回

的是指向新構造物件的引用。

例子:測試物件類

class

myclass

public myclass(int i, int

j)

public

intsum()

public

bool isbetween(int

i)

public

void set(int a, int

b)

public

void set(double a, double

b)

public

void

show()

,y:", x, y);}}

使用反射:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.reflection;

namespace

reflection

static

void

invokeconsdemo()

console.writeline(")

");}

console.writeline();

intx;

for (x = 0; x < ci.length; x++)

if (x ==ci.length)

else

else

if (m.name.compareto("

set") == 0 && pi[0].parametertype == typeof(double

))

else

if (m.name.compareto("

sum") == 0

)

",val);

}else

if (m.name.compareto("

isbetween

") == 0

)

}else

if (m.name.compareto("

show

") == 0

) }}}}}

執行結果為:

本例中,找到了乙個兩個引數的建構函式,那麼使用下面的語句例項化了乙個該型別的物件:

object reflectob=ci[x].invoke(consargs);

呼叫invoke()方法後,reflectob將引用乙個myclass型別的物件。此後,程式將執行

reflectob上的方法。

注意:本例為了簡單起見,假設了乙個使用兩個引數的建構函式,並且兩個引數都為int型別

。但在實際的應用程式中,必須檢驗每乙個引數的型別。

C 基礎知識回顧 反射(1)

反射 reflection 是一種允許使用者獲得型別資訊的c 特性。術語 反射 源自於它的工作方式 type物件對映它所代表的底層物件。對type物件進行查詢可以獲得 反射 與型別相關的資訊。反 射是一種 功能強大的機制,它允許學習和使用只在執行時才能知道的型別功能。這些是官方定義,其實說白了,反射...

C 基礎知識回顧 反射(2)

使用反射呼叫方法 一旦知道乙個型別所支援的方法,就可以對方法進行呼叫。呼叫時,需使用包含在 methodinfo中的invoke 方法。呼叫形式 object invoke object ob,object args 這裡ob是乙個物件引用,將呼叫它所指向的物件上的方法。對於靜態方法,ob必須為nu...

c 基礎知識回顧

1.資料型別和類。所有程式設計都是處理輸入和輸出。關於輸入引數,從右至左把引數入棧,這樣根據棧基址,可以定位第乙個引數。因為很多函式是引數數量不定的,比如printf.關於輸出,記得輸出時,一般是把值放入eax 暫存器,所以一般資料型別,直接放入返回值資料,暫存器可以裝下,而返回物件,會返回物件的指...