泛型反射技巧

2021-04-12 14:11:47 字數 2796 閱讀 8351

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...