2011-11-23 2 views
2

Parallel.ForEach를 호출하는 동적 메서드를 작성하려고합니다. 샘플 클래스의 일리노이를 확인한 결과 중첩 된 유형이 생성되어 있음을 확인했습니다. <> c__DisplayClass #Reflection.Emit and Parallel.ForEach

동적 인 구현 인 Parallel.ForEach를 만들었지 만 중첩 클래스는 일반적인 유형입니다. 그것은 <> C __....

라는 이름으로 그리고 내 생성 된 코드가 약간 달라 보이는 것을의 반사경에 검사 할 때 때문에 나는 생각되지 않습니다

private void SayHello(string name) 
{ 
    SayHelloInvoker invoker = new SayHelloInvoker(name); 
    Parallel.ForEach<ITest>(this, new Action<ITest>(invoker.SayHello)); 
} 

그러나 반사경 외모에 검사 컴파일 코드 같은 :

private void SayHello(string name) 
{ 
    Parallel.ForEach<ITest>(this, delegate (ITest x) { x.SayHello(name)); }); 
} 

현재 구현은 잘 작동하지만 <> C __....

로 입력 중첩되어 생성하는 캐치가 어디 난 아직도 파악하고 싶습니다

누군가가 올바른 방향으로 나를 가리킬 수 있다면 제발 호기심을 만족시킬 수 있기를 바랍니다. :)

+0

어쨌든 프레임 워크 버전으로 표현식 트리를 사용해야한다고 말하고 싶습니다. – sehe

답변

1

부모 메서드의 변수를 사용하는 익명 메서드를 만들면 C# 컴파일러는 <>c_...이라는 클로저 클래스를 생성하여 이러한 변수를 공유합니다.

자세한 내용은 see my blog post을 참조하십시오.

동적으로 메소드를 생성하는 경우, 메소드가 필요한 변수에 액세스 할 수 있도록하려는 모든 작업을 수행 할 수 있습니다.
귀하의 SayHelloInvoker은 (아마도) previous closure-less exampleGreaterThan 클래스와 마찬가지로 생성 된 폐쇄 유형과 동일한 역할을하지만 가독성 높은 이름을 사용합니다.