gpt4 book ai didi

c# - Reflection.Emit 和 Parallel.ForEach

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:41 24 4
gpt4 key购买 nike

我正在尝试编写调用 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_... 的闭包类共享这些变量。

欲了解更多信息,see my blog post .

如果你动态生成一个方法,你可以做任何你想做的事情来确保该方法可以访问它需要的变量。
在你的情况下,你的 SayHelloInvoker是(大概)与生成的闭包类型起着相同的作用,但具有更易读的名称,就像 GreaterThan我的课 previous closure-less example .

关于c# - Reflection.Emit 和 Parallel.ForEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8242674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com