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

ジェネリックを使用するには、コンパイラはコンパイル時に型を認識している必要があります。実行時にタイプを決定してジェネリックを作成することはできません。実行時までタイプがわからない場合は、通常、リストを使用します。

リフレクションを使用して、実行時に特定の型のインスタンス化を作成することもできますが、特定の型へのインスタンス化は、主にコンパイラの型推論に役立ちます。コンパイラが知らない場合、プログラムが実行時に気にする理由はあまりありません。

于 2012-12-05T19:16:55.133 に答える
0

プログラムを実行すると tempType は解決されますが、実行前にその不明なタイプの List<> を作成しようとしています。そんなことはできません。

実行時にその tempType を解決し、実行時にリストも作成する必要があります。それを実現するには、リフレクション機能を使用します。

于 2012-12-05T19:19:08.737 に答える
0

リフレクションを使用して、実行時まで不明なインスタンスを作成できますがListTypeこのマナーで作成する必要があるため、厳密に型指定されたリストとして使用することはできません (コンパイル時に型がわからないため) ) 非ジェネリックIListの , dynamic, またはとして扱わざるを得なくなりますobject

于 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

次のようなことをしたいようですね

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 に答える