我试图构建一个灵活的方法来处理不同类型的ConcurrentQueues,因为大多数逻辑处理队列都是一样的。
看起来有点像这样:
private void StartDoWorkButton(object sender, EventArgs e)
{
StartDoWork();
}
private ConcurrentQueue<TestData> myQueue = new ConcurrentQueue<TestData>();
private void StartDoWork()
{
DoWork(myQueue, new TestData());
}
private void DoWork(dynamic queue,object objectType)
{
dynamic outResult = Activator.CreateInstance(objectType.GetType());
while(queue.TryDequeue(out outResult))
{
//do something
}
}
outResult似乎是正确的类型,但是我得到了这样的信息:&#34;最好的重载方法匹配&#39; System.Collections.Concurrent.ConcurrentQueue.TryDequeue(out WinformWith10pxNewProject1.TestData)&# 39;有一些无效的参数&#34;
事情是,当我这样做时它工作正常:
private void DoWork(dynamic queue,object objectType)
{
TestData outResult;// hardcoded type
while(queue.TryDequeue(out outResult))
{
//do something
}
}
有什么办法可以解决这种类型的硬编码问题吗?为我创造的方法提供了很大的灵活性。
亲切的问候,
Matthijs
答案 0 :(得分:2)
我会使用通用方法:
private void DoWork<T>(ConcurrentQueue<T> queue,object objectType)
{
T outResult;// generic type
while(queue.TryDequeue(out outResult))
{
//do something
}
}
这样你可以使用任何类型的ConcurrentQueue&lt; T&GT;
你可以这样称呼:(与硬编码的veriant相同)
private void StartDoWork()
{
DoWork(myQueue, new TestData());
}
如果你需要&lt; T&GT;要具有特定的基本类型或接口,您可以在其上创建约束:
private void DoWork<T>(ConcurrentQueue<T> queue,object objectType) where T: IDisposable
{
T outResult;// generic type
while(queue.TryDequeue(out outResult))
{
//do something
outResult.Dispose();
}
}
IDisposable就是例如。因此,您可以调用Dispose方法(来自IDisposable)