2009-08-31 155 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