2011-11-23 42 views
2

我正在嘗試編寫調用Parallel.ForEach的動態方法。我已經檢查了一個樣本類的IL,並且我注意到有一個嵌套類型生成了,名爲<> c__DisplayClass#Reflection.Emit和Parallel.ForEach

我設法創建了Parallel.ForEach的動態實現,但是我的嵌套類是正常類型的。它沒有被列爲<>ç__....

而且我覺得,因爲我生成的代碼看起來有點不同的反射檢查它的時候:

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)); }); 
} 

當前執行工作得很好,但我還是想找出其中的生成嵌套類型爲<>ç__....

漁獲

所以,如果有人能以正確的方式指出我的意思,那麼我可以滿足我的好奇心。 :)

+0

突發奇想,我會說你應該使用與該框架版本的表達樹。 – sehe

回答

1

當您使用來自父方法的變量的匿名方法時,C#編譯器會生成一個名爲<>c_...的閉包類來共享這些變量。

欲瞭解更多信息,see my blog post

如果您動態生成方法,您可以執行任何操作,以確保該方法可以訪問所需的變量。
就你的情況而言,你的SayHelloInvoker(假設)的作用與生成的閉包類型相同,但其名稱更具可讀性,就像我的previous closure-less example中的GreaterThan類。