通用委托线程

时间:2012-05-02 16:33:03

标签: c# generics queue

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

但是,细节中的魔鬼:为了完成它的工作,线程调用泛型函数,因此线程需要知道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?

1 个答案:

答案 0 :(得分:2)

你不能这样做。您可以做的是让类GenericItem<T>实现非泛型接口(或从非泛型基类派生),它为您提供足够的功能供您使用。然后你就可以拥有

Queue<ISomething> myGenericListofItemsToWorkOn;

当您从队列中提取项目ISomething时,应该为您提供足够的功能来处理每个项目。

更新:这是永远不会有用的:

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

要进行此类调用,编译器需要知道X是什么,因为您明确指定了它,或者因为它可以从...的类型推断它。但由于列表中包含不同类型的项目,因此您只能通过GetType()告诉您在运行时从包中取出的内容。你不能吃蛋糕也不能吃;要么Queue必须包含只有一种类型的对象,要么Library.Call不能包含“强类型”。