Reflection.Emit and Parallel.ForEach

本文关键字:ForEach Parallel and Emit Reflection | 更新日期: 2023-09-27 18:15:27

我试图编写调用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)); });
}

目前的实现工作得很好,但我仍然想找出在生成嵌套类型的<>c__....

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

Reflection.Emit and Parallel.ForEach

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

更多信息,请看我的博客。

如果你动态地生成一个方法,你可以做任何你想做的事情来确保这个方法可以访问它需要的变量。
在您的示例中,您的SayHelloInvoker(大概)充当与生成的闭包类型相同的角色,但是具有更可读的名称,就像我前面的无闭包示例中的GreaterThan类一样。