1

我正在尝试构建一种灵活的方法来处理不同类型的并发队列,因为大多数处理队列的逻辑是相同的。

它看起来有点像这样:

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 似乎是正确的类型,但我收到以下消息:“'System.Collections.Concurrent.ConcurrentQueue.TryDequeue(out WinformWith10pxNewProject1.TestData)' 的最佳重载方法匹配有一些无效参数”

事情是,当我这样做时它工作正常:

    private void DoWork(dynamic queue,object objectType)
    {
        TestData outResult;// hardcoded type
        while(queue.TryDequeue(out outResult))
        {
            //do something
        }
    }

有什么办法可以解决类型的硬编码?将为我正在创建的方法提供很大的灵活性。

亲切的问候,

马蒂斯

4

1 回答 1

3

我会为此使用通用方法:

private void DoWork<T>(ConcurrentQueue<T> queue,object objectType)
{
    T outResult;// generic type
    while(queue.TryDequeue(out outResult))
    {
        //do something
    }
}

这样您就可以使用任何类型的 ConcurrentQueue<T>。

你可以这样称呼它:(与硬编码的 veriant 相同)

private void StartDoWork()
{
    DoWork(myQueue, new TestData());
}

如果您需要 < T> 是特定的基本类型或接口,您可以在其上创建约束:

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)

于 2013-09-04T09:51:35.873 回答