2012-12-05 103 views
1

我想通过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>(); 

当我尝试这一点,给出了错误:

The type or namespace name 'tempType' could not be found (are you missing a using directive or an assembly reference?)

我的假设,为什么是因为它正在寻找那些全球可用的类型,并且没有查看此方法的本地成员变量。我该如何做这样的事情?

编辑: 为了给出更多的上下文,我尝试使用Quartz.NET,并且试图用它创建不同的作业,所以这个例子中的每个类型都是不同的作业类,每个作业类都有它们的具体的执行命令。不同的情况是当我想访问特定的工作类时。然后,我将通过创建工作:

tempJob = JobBuilder.Create<tempType>() 
      .WithIdentity("SomeJob " + i) 
      .UsingJobData() 
      .Build(); 
+1

你能描述一下你为什么需要这样做;把这个要求放在上下文中,因为它可能不是解决这个问题的最好方法。 – Servy

+0

我添加了你请求的上下文。 – Xantham

+0

由于'Create'方法在那里显示,您应该只需在该方法的泛型参数中指定类。如果你不这样做,那么流式接口中的下一个方法将不知道(在编译时)该类型是什么,所以他们将无法对'List'做任何事情。 – Servy

回答

1

要使用泛型,编译器必须知道编译时的类型;您无法在运行时确定类型并创建通用类型。如果直到运行时才知道类型,通常只需使用List。

您可以使用反射在运行时创建特定的类型实例,但实例化为特定的类型主要用于类型推理的编译器;如果编译器不知道,那么程序在运行时就没有太多理由关心它。

0

可以用户反映用不知道,直到运行时Type创建的List的实例,但是因为它需要在这个庄园被创建,你不能把它作为一个强类型列表(再一次,因为该类型在编译时不知道),您将被迫将其视为非通用的IList,dynamicobject

0

你会发现,这不起作用或者:

Type tempType = typeof(int); 
List<tempType> theList = new List<tempType>(); 

基本上,一般需要的类型在编译时是已知的;你不能在运行时创建它。对此有各种各样的原因,因为如果编译器不知道类型是什么类型的话,编译器将无法执行关于泛型的各种规则。

只需使用非通用List

0

当您运行该程序时,您的tempType将被解析,但您尝试在运行时创建该未知类型的列表> <>。你不能那样做。

您需要在运行时解析该tempType并在运行时创建您的List。使用反射设施来实现这一点。

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那儿。

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();