我想通过一个switch语句来确定用什么类型来创建包含泛型的东西。
下面是一段愚蠢但有说明性的代码,展示了我要做的事情:
Type tempType;
switch(number)
{
case 0:
tempType = typeof(int);
break;
case 1:
tempType = typeof(bool);
break;
case 2:
tempType = typeof(long);
break;
}
List<tempType> theList = new List<tempType>();
当我尝试这个时,它会给出错误:
找不到类型或命名空间名称'tempType'(您是否缺少using指令或程序集引用?)
我之所以假设是因为它正在寻找那里全局可用的类型,并且没有查找此方法的本地成员变量。我怎么能这样做?
编辑: 为了给出更多的上下文,我试图使用Quartz.NET,并且我试图用它创建不同的作业,所以这个例子中的每个类型都是不同的Job Classes,每个类都有它们特定的执行命令。不同的情况是我想要访问特定的工作类。然后我会通过以下方式创建工作:
tempJob = JobBuilder.Create<tempType>()
.WithIdentity("SomeJob " + i)
.UsingJobData()
.Build();
答案 0 :(得分:2)
您可以尝试下一步:
Type tempType = typeof(int);
switch (number)
{
case 0:
tempType = typeof(int);
break;
case 1:
tempType = typeof(bool);
break;
case 2:
tempType = typeof(long);
break;
}
Type customListType = typeof(List<>).MakeGenericType(tempType);
IList objectList = (IList)Activator.CreateInstance(customListType);
但IList不是通用接口,因此您将拥有object
。
答案 1 :(得分:1)
要使用泛型,编译器必须在编译时知道类型;您无法在运行时确定类型并创建泛型。如果直到运行时才知道类型,通常只使用List。
您可以使用反射在运行时创建特定类型实例化,但实例化为特定类型对于类型推断的编译器主要有用;如果编译器不知道,那么你的程序在运行时并不需要太多理由。
答案 2 :(得分:0)
您可以使用反射来创建List
的实例,其中Type
在运行时之前是未知的,但由于需要在此庄园中创建它,因此您不能将其用作强类型列表(同样,由于在编译时不知道类型),您将被迫将其视为非通用IList
,dynamic
或object
。
答案 3 :(得分:0)
您会注意到这也不起作用:
Type tempType = typeof(int);
List<tempType> theList = new List<tempType>();
基本上,通用的类型需要在编译时知道;你无法在运行时创建它。这有各种各样的原因,因为如果编译器不知道它是什么类型,编译器将无法强制执行各种规则。
只需使用非通用List
。
答案 4 :(得分:0)
运行程序但是您尝试创建List&lt;&gt;时,将解析您的tempType。在运行时之前的那种未知类型你不能这样做。
您需要在运行时解析该tempType并在运行时创建List。使用Reflection工具来实现这一目标。
答案 5 :(得分:0)
听起来你想要做像
这样的事情Type tempType ;
var number = 0;
switch(number)
{
case 0:
tempType = typeof(Quartz.Job.DirectoryScanJob);
break;
...
default :
tempType = typeof(Quartz.Job.NoOpJob);
break;
}
int i = 0;
var tempJob = JobBuilder.Create()
.OfType(tempType)
.WithIdentity("SomeJob " + i)
.Build();