2

インスタンス化時に、System.Threading.AutoResetEventを介して作業が行われるのを待機するバックグラウンドスレッドを作成するクラスがあります。作業が利用可能になると、スレッドは汎用キューからオブジェクトをプルして作業し、終了時にオブジェクトからコールバックデリゲートを呼び出します。

ただし、詳細には悪魔がいます。その作業を行うには、スレッドがジェネリック関数を呼び出すため、スレッドがTypeを認識している必要があります。キュー内のオブジェクトを定義してジェネリックを受け入れることはできますが、本当にジェネリックなオブジェクトを受け入れるようにキューを定義するにはどうすればよいですか。つまり、そのタイプは何でもかまいません。バックグラウンドスレッドは、ジェネリック関数呼び出しに必要な型をどのように推測できますか?

サンプルコード:

class GenericItem<T> 
{
  // ... some code ...
}

// somewhere else in code
Queue<GenericItem> myGenericListofItemsToWorkOn; 

明らかに、C#は具体的なタイプを指定しないようにしているので、最後の行が気に入らないので、次のことができます。

myGenericListofItemsToWorkOn.Enqueue( new GenericItem<string>() );
myGenericListofItemsToWorkOn.Enqueue( new GenericItem<int>() ); 

次に、私のスレッドは次のことを行う必要があります。

GenericItem obj = myGenericListofItemsToWorkOn.Dequeue(); // How can I reference a generic item here?
Library.Call<...>(...);  // How can I infer the generic type of the item dequeued here?
4

1 に答える 1

2

これはできません。あなたができることはGenericItem<T>、あなたが作業するのに十分な機能を公開する非ジェネリックインターフェースをクラスに実装させる(または非ジェネリック基本クラスから派生させる)ことです。その後、あなたは持つことができるでしょう

Queue<ISomething> myGenericListofItemsToWorkOn;

アイテムをキューから引き出すと、ISomething各アイテムで作業するのに十分な機能が公開されます。

更新:これは決して機能しないものです:

Library.Call<X>(...);

このような呼び出しを行うには、コンパイラーXは、明示的に指定するか、の型から推測できるため、何であるかを知る必要があります...。ただし、リストにはさまざまなタイプのアイテムが含まれているため、実行時にバッグから何を引き出したかは、でしかわかりませんGetType()。あなたはあなたのケーキを持ってそれを食べることもできません。Queue1つのタイプのみのオブジェクトが含まれている必要があります。または、「Library.Call強く型付けされている」オブジェクトであってはなりません。

于 2012-05-02T16:34:52.433 に答える