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__....
所以如果有人能给我指出正确的方式,这样我就能满足我的好奇心。:)
当你创建一个使用父方法变量的匿名方法时,c#编译器会生成一个名为<>c_...
的闭包类来共享这些变量。
更多信息,请看我的博客。
如果你动态地生成一个方法,你可以做任何你想做的事情来确保这个方法可以访问它需要的变量。
在您的示例中,您的SayHelloInvoker
(大概)充当与生成的闭包类型相同的角色,但是具有更可读的名称,就像我前面的无闭包示例中的GreaterThan
类一样。