當泛型的引數型別是動態的

2021-09-05 16:20:12 字數 862 閱讀 1912

在使用泛型技術時,我們經常使用靜態泛型引數,即泛型的引數型別在編譯時就已經確定,比如:

ilist

<

int>

list 

=new

list

<

int>

();    

集合ilist的泛型引數是int型別,這在編譯期就可以知道,於是,我們可以這樣呼叫ilist<>的add方法:

list.add(6) ;

如果泛型的引數型別是動態的了,也就是說,只有當程式執行起來後,才知道泛型引數的具體型別,其可能是int,也可能是string或其它。那該如何?使用反射,大家都知道這個答案,是的,使用反射可以解決問題,但是,反射就會有兩個與身俱來的缺陷:一是喪失了強型別的好處,二是效率不高。

還有一種更優雅的解決方案,那就是使用動態**。針對上述的例子,我們首先定義乙個非泛型的介面:

//////i******list 用於建立動態**,將執行時的ilist

<>

介面轉換為靜態的i******list介面

///

public

inte***ce

i******list

然後,呼叫esbasic.emit.dynamictypeemitter類的static createdynamicproxy方法,建立動態**例項,該動態**實現了i******list介面,接著便可以呼叫i******list的add方法來新增元素到集合中。

public

static

void

calladddemo(type listelementtype ,

object

addedelement)

泛型的動態引數型別使用介紹

在使用泛型技術時,我們經常使用靜態泛型引數,即泛型的引數型別在編譯時就已經確定,比如 ilist int list new list int 集合ilist的泛型引數是int型別,這在編譯期就可以知道,於是,我們可以這樣呼叫ilist 的add方法 list.add 6 如果泛型的引數型別是動態的了...

泛型型別引數的約束

泛型型別引數的約束 在定義泛型類時,可以對客戶端 能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端 嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用where上下文關鍵字指定的。下表列出了六種型別的約束 約束 說明 t 結構 型別引數必須是值型別。...

泛型型別的引數約束

t 結構 型別引數必須是值型別。可以指定除 nullable 以外的任何值型別。t 類 型別引數必須是引用型別 這一點也適用於任何類 介面 委託或陣列型別。t new 型別引數必須具有無引數的公共建構函式。當與其他約束一起使用時,new 約束必須最後指定。t 基類名 型別引數必須是指定的基類或派生自...