在使用泛型技術時,我們經常使用靜態泛型引數,即泛型的引數型別在編譯時就已經確定,比如:
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 基類名 型別引數必須是指定的基類或派生自...