獲取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 暫存器,所以一般資料型別,直接放入返回值資料,暫存器可以裝下,而返回物件,會返回物件的指...