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

本文关键字:语法 实际上 是什么 意思 编译 动态 操作 | 更新日期: 2023-09-27 18:09:25

我最近不得不在同事不在的时候对他们的代码进行反编译,并发现大部分代码看起来出奇地好(感谢ILSpy),除了几个我们需要使用dynamic的地方——这些地方被分成了几个部分:

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

我的问题是关于第一点中类声明的语法。它看起来像一个泛型类,但它显然不是。有人能解释一下这是怎么回事吗?

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

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

下面是一个自动生成类的例子:

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

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