我试图编写调用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 __....
所以,如果有人能以正确的方式指出我,那么我就能满足我的好奇心。 :)
答案 0 :(得分:1)
当您创建一个使用父方法变量的匿名方法时,C#编译器会生成一个名为<>c_...
的闭包类来共享这些变量。
有关详细信息,请see my blog post。
如果您动态生成方法,则可以执行任何操作,以确保方法可以访问所需的变量。
在您的情况下,您的SayHelloInvoker
(可能)与生成的闭包类型具有相同的作用,但名称更易读,就像我previous closure-less example中的GreaterThan
类一样。