C# 使用存储在变量中的泛型声明列表

C# 使用存储在变量中的泛型声明列表,c#,generics,quartz.net,C#,Generics,Quartz.net,我想通过switch语句来确定生成包含泛型with的内容的类型 下面是一段愚蠢但具有说明性的代码,显示了我正在尝试做的事情: Type tempType; switch(number) { case 0: tempType = typeof(int); break; case 1: tempType = typeof(bool); break; case 2: tempType = typeof(long);

我想通过switch语句来确定生成包含泛型with的内容的类型

下面是一段愚蠢但具有说明性的代码,显示了我正在尝试做的事情:

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>();
Type;
开关(编号)
{
案例0:
试探类型=类型(int);
打破
案例1:
TENTYPE=typeof(布尔);
打破
案例2:
TENTYPE=类型(长);
打破
}
列表列表=新列表();
当我尝试此操作时,会出现以下错误:

找不到类型或命名空间名称“试探类型”(是否缺少using指令或程序集引用?)

我对其原因的假设是,它正在查找全局可用的类型,而不是查找此方法的局部成员变量。我怎么能做这样的事

编辑: 为了提供更多的上下文,我尝试使用Quartz.NET,并尝试使用它创建不同的作业,因此本示例中的每个类型都是不同的作业类,每个类都有其特定的执行命令。不同的情况是当我想要访问特定的作业类时。然后,我将通过以下方式创建作业:

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

您可以使用反射来创建一个运行时才知道类型的
列表
实例,但是因为它需要在这个庄园中创建,所以您不能将它用作强类型列表(同样,因为编译时不知道类型),您将被迫将其视为非泛型
IList
动态
对象

您会注意到这也不起作用:

Type tempType = typeof(int);
List<tempType> theList = new List<tempType>();
Type-testype=typeof(int);
列表列表=新列表();
基本上,泛型的类型需要在编译时知道;您不能在运行时创建它。这有各种各样的原因,因为编译器如果不知道泛型是什么类型,就无法强制执行泛型的各种规则


只需使用非泛型
列表

即可使用泛型编译器必须在编译时知道类型;无法在运行时确定类型并创建泛型。如果直到运行时才知道类型,通常只使用列表


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

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


您需要在运行时解析该试探类型,并在运行时创建列表。使用反射设施来实现这一点。

您可以尝试下一步:

        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);
Type-testype=typeof(int);
开关(编号)
{
案例0:
试探类型=类型(int);
打破
案例1:
TENTYPE=typeof(布尔);
打破
案例2:
TENTYPE=类型(长);
打破
}
类型customListType=typeof(列表)。MakeGenericType(试探型);
IList objectList=(IList)Activator.CreateInstance(customListType);

但是IList不是通用接口,因此您将在那里有
对象

听起来你想做点什么

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

你能描述一下你为什么需要这样做吗;将此要求放在上下文中,因为这可能不是解决该问题的最佳方法。我添加了您请求的上下文。正如
Create
方法所示,您可能只需要在方法的泛型参数中指定类。如果您不这样做,那么fluent界面中的下一个方法将不知道(在编译时)类型是什么,因此他们将无法对
列表执行任何操作。请参见“”,其中的共识是“不,他们不应该”。@Servy我试图通过不重复.withIdentity().usingjobdata().build()来进行一些优化,因为所有作业都需要它,但泛型中的每个类都必须不同。我只是讨厌重复同一件事多次,因为这会让可维护性变得更糟。但从好的方面来说,我更了解泛型如何在引擎盖下工作。