1

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

  1. 调用站点容器 - 即在定义中类似于类,但假设使用的方法dynamicDoStuffpublic /* static? I forget */ class <DoStuff>CallSiteContainer_Plus_Some_Weirdness { /* bunch of CallSite fields */ }
  2. 很多代码检查容器中的各种 CallSite 是否已被分配,并在使用前根据需要使用我还没有得到的方法分配它们。

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

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

4

1 回答 1

3

这是此类自动生成的类的示例:

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

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

于 2015-08-23T10:10:26.893 回答