2

我有一个类 - 在实例化时 - 创建一个后台线程,等待通过 System.Threading.AutoResetEvent 完成工作。当工作可用时,线程将从通用队列中拉出一个对象以进行工作,然后在完成时从该对象调用回调委托。

然而,魔鬼在细节中:为了完成它的工作,线程调用了一个泛型函数,所以线程需要知道一个类型。我可以将队列中的对象定义为接受泛型,但如何定义队列以接受真正泛型的对象,即它的类型可以是任何东西?后台线程如何推断其通用函数调用所需的类型?

示例代码:

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(). 你不能一边吃蛋糕一边吃;要么Queue必须只包含一种类型的对象,要么Library.Call不能是“强类型”的。

于 2012-05-02T16:34:52.433 回答