2013-09-04 8 views
0

Я пытаюсь создать гибкий метод обработки различных типов ConcurrentQueues, потому что большинство логики для обработки очереди одинаковы.concurrentQueue tryDequeue с неизвестным результатом

Это выглядит как это:

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 (из WinformWith10pxNewProject1.TestData)»имеет некоторые недопустимые аргументы»

Дело в том, что хорошо работает, когда я делаю это:

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

есть ли способ, что я могу приста k вокруг жесткого кодирования типа? Это даст мне большую гибкость для методов, которые я создаю.

С наилучшими пожеланиями,

Matthijs

+0

Вы не должны использовать динамику для этого. Смотрите здесь для получения дополнительной информации: http://stackoverflow.com/questions/2674906/when-should-one-use-dynamic-keyword-in-c-sharp-4-0 –

ответ

2

Я хотел бы использовать общий метод для этого:

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>, чтобы быть определенным BaseType или интерфейса, вы можете создать ограничение целостности на нем:

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)

+0

Спасибо! Работает так, как хотелось бы, чтобы он работал ;-) – user369122