泛型反射技巧總結

2021-06-29 02:40:24 字數 2636 閱讀 3506

本文為一些泛型反射技巧的簡單羅列,為日後的文章做準備。

1、如何獲得乙個封閉構造型別(closed constructed type)的type物件?

假設有如下的型別:

class testtype

class testtype

如果要獲得封閉構造型別的type物件,那麼只需要用c#的typeof運算子,或者vb的gettype運算子作用於具體型別即可:

//c#

type t1 = 

typeof(testtype<

int>);'vb

dim t2 

as type = 

gettype(testtype(of 

string))

2、如何獲取乙個泛型型別(generic type)的type物件?

所謂泛型型別,就是有型別引數,但型別引數還未指定的原始定義。我們不能用testtype這樣的語法,因為t在我們的上下文中不存在。這時,可以用空的尖括號(c#)或空的of語句(vb)來獲取。

type t1 = 

typeof(testtype<>);

type t2 = 

typeof(testtype<,>);

dim t1, t2 

as type

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物件獲取的。'vb

dim t 

as type = 

gettype(list(of 

integer)) '

get the generic arguments, an array

dim typeargs 

as type() = t.getgenericarguments() '

get the first argument: integer in this case

dim targ0 

as type = 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)

dim tlist 

as type = 

gettype(list(of )) '

get the "t" of list(of t)

dim typeparam 

as type = tlist.getgenericarguments()(0) '

the generic type of ienumerable(of t)

dim tienum 

as type = 

gettype(ienumerable(of )) '

make the open constructed type

dim tienumopen 

as type = tienum.makegenerictype(typeparam) '

只有用這種方法獲得開放構造型別

'你才能用這個語法獲得真正想要的建構函式定義

'因為建構函式定義裡ienumerable(of t)是乙個開放構造型別

dim c 

as constructorinfo = _

tlist.getconstructor(

new type() )

大家可以回去結合試驗理解這些用法。

泛型反射技巧

1 如何獲得乙個封閉構造型別 closed constructed type 的type物件?假設有如下的型別 class testtype t class testtype t,u 如果要獲得封閉構造型別的type物件,那麼只需要用c 的typeof運算子,或者vb的gettype運算子作用於具體...

java泛型反射總結

在需求中,資料庫有兩張表user,admin。我們要查詢裡面的id,name等資訊通常都是寫兩個dao,然後分別給每個查詢欄位寫一套方法。然而其實查詢這些欄位的方法都大同小異,所以產生了乙個更好的解決辦法,就是寫乙個通用的dao,然後把相同的方法寫在通用的dao genericdao 裡,然後然實體...

泛型和反射

泛型允許程式設計師在 中將變數或引數的型別,先用 型別佔位符 來代替,等到允許的時候再根據傳入的 類 來代替 泛型是指帶型別引數的類,而不是引數本身。類 方法 結構 介面都可定義為泛型 可以定義多個引數 public class person 例項化乙個引用引數型別的泛型,它的記憶體分配的大小是一樣...