2009-08-31 96 views
14

我不認爲這可以在C#中完成,但發佈這只是爲了確保。這是我的問題。我願做這樣的事情在C#:在C#中使用類型參數的泛型類型

var x = 10; 
var l = new List<typeof(x)>(); 

var x = 10; 
var t = typeof(x); 
var l = new List<t>(); 

但是,當然,這是行不通的。雖然這不應該成爲一個問題,因爲類型t在編譯時解析。我知道這可以通過反射來解決,但是由於類型在編譯時已知,所以使用反射會是過度的。

+0

爲X總是將是10或者是說只是一個證明概念?我只是想知道你是否可以避免使用var關鍵字。 – 2009-08-31 17:54:59

+0

這只是一個概念的證明。我試圖使用Func <>和Expression <>的這種代碼來擺脫多餘的輸入。 所以這種類型可以明確聲明:

 int x = 10; var l = new List(); 
Max 2009-08-31 18:15:44

回答

41
public static List<T> CreateCompatibleList<T> (T t) 
{ 
    return new List<T>() ; 
} 

var x = 10 ; 
var l = CreateCompatibleList (x) ; 
+0

不錯的一個。真的很喜歡這個解決方案。 – Dykam 2009-08-31 17:59:18

+1

+1偷偷摸摸,併爲這個案件工作。 :) – 2009-08-31 17:59:18

+0

Muy clevar!做得很好。 – 2009-08-31 18:05:31

3

定義泛型在C#這樣做:

var someList = new List<int>(); 

您可以這樣定義泛型:

var x = 1; 
var someType = typeof(x); 
var someList = new List<someType>(); 

,因爲你指定在這種情況下,在運行時類型,而不是編譯時間。 C#不支持。

+4

你剛剛重複了什麼馬克斯在問題中說。 – 2009-08-31 17:57:39

+1

@Anton不,我沒有,Max的印象是typeof(x)在編譯時被解析,這是不正確的。 – Joseph 2009-08-31 18:00:02

+0

@約瑟夫:你確定嗎?我知道x.GetType()在運行時被解析,因爲它給出了x當前引用的類型,但我認爲typeof(x)將始終給出在編譯時定義的變量類型。 – 2009-08-31 18:07:33

6

你想讓.Net使用運行時操作符設置泛型類型。如你所知,這是行不通的。泛型類型必須在編譯時設置爲

2

你不能做到這一點你究竟是如何要求,但有一點反射,你可以完成同樣的事情

Type genericType = typeof(List<>); 
Type[] type = new Type[] { typeof(int) }; 
Type instanceType = genericType.MakeGenericType(type); 
object instance = Activator.CreateInstance(instanceType); 
var l = (List<int>)instance; 
+2

'(List )'在最後一行中失敗了你的目的。但是,是的,這在某些情況下很有用。 – 2009-08-31 18:00:35