1、如何獲得乙個封閉構造型別(closed constructed type)的type物件?
假設有如下的型別:
class
testtype
<
t>
class
testtype
<
t, u
>
如果要獲得封閉構造型別的type物件,那麼只需要用c#的typeof運算子,或者vb的gettype運算子作用於具體型別即可: //
c#type t1
=typeof
(testtype
<
int>);
'vbdimt2
astype
=gettype
(testtype(of
string))
2、如何獲取乙個泛型型別(generic type)的type物件?
所謂泛型型別,就是有型別引數,但型別引數還未指定的原始定義。我們不能用testtype這樣的語法,因為t在我們的上下文中不存在。這時,可以用空的尖括號(c#)或空的of語句(vb)來獲取。
type t1
=typeof
(testtype
<>
);type t2
=typeof
(testtype
<
,>);
dimt1, t2
astype
t1 =
gettype
(testtype(of ))
t2 =
gettype
(testtype(of ,))
注意,我們可以用逗號來區別型別引數的個數。這就表明,泛型型別只能按型別引數的多少來過載,而不管有何種約束之類。這裡獲得的type,就是型別引數未指定的泛型型別。
3、如何從構造型別的type物件生成泛型型別的type物件?
type類的新增方法可以做到。 //
c#type ct
=typeof
(list
<
int>
);//
get generic type definition
type gt
=ct.getgenerictypedefinition();
4、如何獲取型別引數的type物件?
泛型型別的t, u等型別引數,以及執行中的實際取值,都是可以從type物件獲取的。 '
vbdim
t as
type
=gettype
(list(of
integer))'
get the generic arguments, an array
dimtypeargs
astype()
=t.getgenericarguments()
'get the first argument: integer in this case
dimtarg0
astype
=typeargs(0)
5、從泛型型別type物件生成構造型別的type物件。
通常可以用來從一種構造型別生成另一種構造型別 //
c#type ct
=typeof
(list
<
int>
);type gt
=ct.getgenerictypedefinition();
//make another constructed type
//the listin this case
type ct2
=gt.makegenerictype(
typeof
(string
));
6、如何取乙個開放構造型別(open constructed type)的type物件?
開放構造型別是最難處理的乙個,因為他們的型別引數已經指定,但沒有指定為具體型別,而是指定為其他泛型型別的型別引數。這種型別在進行反射過載選取以及反射發出(reflection emit)操作的時候尤為重要。我們的手法就是,先從宿主泛型型別的定義中獲取型別引數的型別,然後再建造出開放構造型別。這裡,我們獲得list的建構函式的引數,ienumerable的型別,注意這裡的t是list所定義的,而不是泛型ienumerable自己的型別引數 '
the generic type of list(of t)
dimtlist
astype
=gettype
(list(of ))
'get the "t" of list(of t)
dimtypeparam
astype
=tlist.getgenericarguments()(0)
'the generic type of ienumerable(of t)
dimtienum
astype
=gettype
(ienumerable(of ))
'make the open constructed type
dimtienumopen
astype
=tienum.makegenerictype(typeparam)
'只有用這種方法獲得開放構造型別
'你才能用這個語法獲得真正想要的建構函式定義
'因為建構函式定義裡ienumerable(of t)是乙個開放構造型別
dimc
asconstructorinfo =_
tlist.getconstructor(
newtype() )
泛型反射技巧總結
本文為一些泛型反射技巧的簡單羅列,為日後的文章做準備。1 如何獲得乙個封閉構造型別 closed constructed type 的type物件?假設有如下的型別 class testtype class testtype 如果要獲得封閉構造型別的type物件,那麼只需要用c 的typeof運算子...
泛型和反射
泛型允許程式設計師在 中將變數或引數的型別,先用 型別佔位符 來代替,等到允許的時候再根據傳入的 類 來代替 泛型是指帶型別引數的類,而不是引數本身。類 方法 結構 介面都可定義為泛型 可以定義多個引數 public class person 例項化乙個引用引數型別的泛型,它的記憶體分配的大小是一樣...
泛型與反射
泛型 泛型的作用 泛型是jdk1.5以後才有的,可以在編譯時期進行型別檢查,且可以避免頻繁型別轉化!泛型的使用 泛型的方法 public class genericdemo 測試方法 test public void testmethod throws exception 泛型的類 public c...