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 '에 가장 적합한 오버로드 된 메서드 일치.

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

내가 WOR 수있는 방법이 있나요 '(WinformWith10pxNewProject1.TestData 아웃) TryDequeue는 일부 잘못된 인수 "

것은 내가이 작업을 수행 할 때 잘 작동한다있다 유형의 하드 코딩 주위 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의 모든 유형을 사용할 수 있습니다>.

그리고 당신은 그것을 좋아 호출 할 수 있습니다 : 당신이 < T는> 특정 baseType 여기서 또는 인터페이스 될 필요가 있다면 당신이 그것을에 제약을을 만들 수 있습니다 (하드 코딩 된 veriant과 동일)를

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

:

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은 예를 들어 있습니다. 따라서 IDisposable의 Dispose 메서드를 호출 할 수 있습니다.

+0

감사! 나는 그것이 일하고 싶다대로 일한다 ;-) – user369122