Reflection.Emit和Parallel.ForEach

时间:2011-11-23 13:05:52

标签: c# dynamic reflection reflection.emit

我试图编写调用Parallel.ForEach的动态方法。我已经检查了一个样本类的IL,我注意到生成了一个名为<> c__DisplayClass#

的嵌套类型

我确实设法创建了Parallel.ForEach的动态实现,但我的嵌套类是普通类型。它未命名为<> c __....

我认为因为我在生成的代码在Reflector中检查时看起来有点不同:

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

但是在Reflector中检查的编译代码如下:

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

当前的实现工作正常但我仍然想知道生成嵌套的问题在哪里输入&lt;&gt; c __....

所以,如果有人能以正确的方式指出我,那么我就能满足我的好奇心。 :)

1 个答案:

答案 0 :(得分:1)

当您创建一个使用父方法变量的匿名方法时,C#编译器会生成一个名为<>c_...的闭包类来共享这些变量。

有关详细信息,请see my blog post

如果您动态生成方法,则可以执行任何操作,以确保方法可以访问所需的变量。
在您的情况下,您的SayHelloInvoker(可能)与生成的闭包类型具有相同的作用,但名称更易读,就像我previous closure-less example中的GreaterThan类一样。