在C#中使用类型参数的泛型类型
我不认为这可以在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在编译时解析。我知道这可以通过反射来解决,但是由于类型在编译时已知,所以使用反射会是过度的。
public static List<T> CreateCompatibleList<T> (T t)
{
return new List<T>() ;
}
var x = 10 ;
var l = CreateCompatibleList (x) ;
不错的一个。真的很喜欢这个解决方案。 – Dykam 2009-08-31 17:59:18
+1偷偷摸摸,并为这个案件工作。 :) – 2009-08-31 17:59:18
Muy clevar!做得很好。 – 2009-08-31 18:05:31
定义泛型在C#这样做:
var someList = new List<int>();
您可以不这样定义泛型:
var x = 1;
var someType = typeof(x);
var someList = new List<someType>();
,因为你指定在这种情况下,在运行时类型,而不是编译时间。 C#不支持。
你刚刚重复了什么马克斯在问题中说。 – 2009-08-31 17:57:39
@Anton不,我没有,Max的印象是typeof(x)在编译时被解析,这是不正确的。 – Joseph 2009-08-31 18:00:02
@约瑟夫:你确定吗?我知道x.GetType()在运行时被解析,因为它给出了x当前引用的类型,但我认为typeof(x)将始终给出在编译时定义的变量类型。 – 2009-08-31 18:07:33
你想让.Net使用运行时操作符设置泛型类型。如你所知,这是行不通的。泛型类型必须在编译时设置为。
你不能做到这一点你究竟是如何要求,但有一点反射,你可以完成同样的事情
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;
'(List
为X总是将是10或者是说只是一个证明概念?我只是想知道你是否可以避免使用var关键字。 – 2009-08-31 17:54:59
这只是一个概念的证明。我试图使用Func 和Expression 的这种代码来摆脱多余的输入。 所以这种类型可以明确声明:
– Max 2009-08-31 18:15:44