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

当我尝试这个时,它给出了错误:

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

我对原因的假设是因为它正在寻找在那里全局可用的类型,而不是在这个方法的本地成员变量中寻找。我怎么能做这样的事情?

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

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

6 回答 6

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 不是通用接口,所以你会有objects 在那里。

于 2012-12-05T19:20:22.750 回答
1

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

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

于 2012-12-05T19:16:55.133 回答
0

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

于 2012-12-05T19:14:51.380 回答
0

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

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

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

只需使用非通用List.

于 2012-12-05T19:16:48.847 回答
0

当您运行程序时,您的 tempType 将被解析,但您试图在运行前创建一个未知类型的 List<>。你不能那样做。

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

于 2012-12-05T19:19:08.737 回答
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();
于 2012-12-06T14:56:23.563 回答