2012-02-23 128 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>,为你治疗项目为“未知类型”。