2012-02-23 103 views
0

我如何可以定義一個類型列表,這樣我可以用它作爲:與類型的動態計數泛型類型參數

var l1 = new List<int>(); 
var l2 = new List<int, long>(); 
var l3 = new List<int, long, byte>(); 

+0

你正在嘗試實現目前還不清楚。在.NET中沒有List 的原因是它沒用。你可以創建一個包裝int long和byte的類型,並且創建一個這種類型的列表。 – 2012-02-23 09:58:39

+0

你的用例是什麼?你應該向我們解釋你想做什麼。 – ken2k 2012-02-23 10:22:38

+0

我嘗試歸檔的一件事是列表類型,可以使用不同的類型參數計數創建。在我的認識中,它需要將一些類型映射到List(而不是將它們傳遞給任何方法)。 – devi 2012-02-23 10:23:33

回答

2

您可以使用元組的列表:

var l1 = new List<int>(); 
var l2 = new List<Tuple<int, long>>(); 
var l3 = new List<Tuple<int, long, byte>>(); 
+0

最終繼承Tuple類以創建更具體的類 – 2012-02-23 10:01:58

+0

'Tuple'是一個好主意,但我認爲應該指出它需要.Net 4.0。 – ken2k 2012-02-23 10:18:56

+0

使用不像直接枚舉類型那樣清晰的元組,但是不錯的主意。它有.net 3.5中的任何模擬? – devi 2012-02-23 10:39:04

0

所以,我找到了解決辦法。它需要定義基本類型名單:它

class List { } 

,並繼承了一些孩子的的:

class List<T> { } 

class List<T, T1> : List<T> { } 

class List<T, T1, T2> : List<T> { } 

(繼承不一定,但它需要如果清單中已澆注到列表)

基本列表構造可以得到所有應用的通用參數:

class List 
{ 
    Type[] _types; 

    public List() 
    { 
     _types = GetType().GetGenericArguments(); 
    } 
} 
+0

「繼承」繼承列表將與你一起擰。您必須重寫每個成員,以便兩個集合都得到更新,或者定義一個**顯式**運算符,以便從一個到另一個轉換器。我強調明確,因爲信息丟失(當你投到列表時,T1和T2發生了什麼?) – 2012-02-23 09:57:00

+0

但是,這仍然只是一個'List '。即您只能添加和刪除類型爲「T」的實例,而不是「T1」和「T2」。還是你想要完成別的事情? – Tyson 2012-02-23 09:57:47

+0

我嘗試歸檔的一件事是列表類型,可以用不同類型的參數計數創建。在我的認識中,它需要將一些類型映射到List(而不是將它們傳遞給任何方法)。基礎構造函數獲取泛型參數並將它們保存到Type []數組中 – devi 2012-02-23 10:19:04

1

說你想GE t從您的l3列表中選擇第3個項目 - 您會做什麼?

如果你的回答是「我想將它轉換爲long,因爲intbyte都澆注到long反正」,你應該首先使用List<long>

如果你要使用的檢索類型l3[3].GetType()if else,你應該考慮使用List<object>,爲你治療項目爲「未知類型」。