反编译c#动态操作时看到的语法到底是什么意思?

What does the syntax seen when decompiling c# dynamic operations actually mean?

我最近不得不尝试在同事不在的时候反编译他们的代码,发现其中大部分看起来都非常好(感谢 ILSpy),除了几个地方我们需要使用 dynamic - 这些被分成几个部分:

  1. 调用站点容器 - 即定义中类似于 class 的内容,但假设使用 dynamic 的方法是 DoStuff,将有一个沿行的声明共 public /* static? I forget */ class <DoStuff>CallSiteContainer_Plus_Some_Weirdness { /* bunch of CallSite fields */ }
  2. 很多代码检查容器内的各种 CallSites 是否已分配,并在使用前根据需要使用我还没有真正了解的方法分配它们。

我的问题是关于第 1 点中 class 声明的语法。它 看起来 像一个通用的 class,但显然不是。谁能解释一下那里发生了什么?

请注意,我不是在寻找原始代码的帮助 - 我已经通过明智地使用查找和替换以及从其他所有内容中分离出自动生成的代码来设法做到这一点。但我想了解 CallSite 容器语法如何成为有效的 class 名称!

这是自动生成的示例 class:

private static class <>o__0
{
    public static CallSite<Action<CallSite, Type, object>> <>p__0;
}

如果您担心 <>o__0 class 名称和 <>p__0 字段名称,那么您是对的,这些不是有效的 C# 名称,但这并不意味着它们不是编译器生成的有效 IL 名称。它使用这种特殊符号的原因是为了确保它们永远不会与您作为开发人员可能编写的 class 名称冲突。