声明一个存储在变量中的泛型的列表

时间:2012-12-05 19:10:45

标签: c# generics quartz.net

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

6 个答案:

答案 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在运行时之前是未知的,但由于需要在此庄园中创建它,因此您不能将其用作强类型列表(同样,由于在编译时不知道类型),您将被迫将其视为非通用IListdynamicobject

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