我最近不得不尝试在同事不在的时候反编译他们的代码,发现大部分代码看起来都非常好(感谢 ILSpy),除了几个我们需要的地方使用 dynamic
- 这些被分解成几个部分:
- 调用站点容器——即在定义上类似于一个类,但让我们说一下
dynamic
所在的方法使用的是DoStuff
, 将有一个类似public /* static? I forget */ class <DoStuff>CallSiteContainer_Plus_Some_Weirdness { /* bunch of CallSite fields */ }
的声明 - 很多代码检查容器内的各种 CallSites 是否已分配,并在使用前根据需要使用我还没有真正了解的方法分配它们。
我的问题是关于第 1 点中类声明的语法。它看起来 像一个泛型类,但显然不是。谁能解释一下那里发生了什么?
请注意,我不是在寻找原始代码的帮助 - 我已经通过明智地使用查找和替换以及从其他所有内容中分离出自动生成的代码来设法做到这一点。但我想了解 CallSite 容器语法如何成为有效的类名!
最佳答案
下面是此类自动生成类的示例:
private static class <>o__0
{
public static CallSite<Action<CallSite, Type, object>> <>p__0;
}
如果您担心 <>o__0
类名和 <>p__0
字段名称,那么你是对的,这些不是有效的 C# 名称,但这并不意味着它们不是编译器生成的有效 IL 名称。它使用这些特殊符号的原因是确保它们永远不会与您作为开发人员可能编写的类名冲突。
关于c# - 反编译c#动态操作时看到的语法到底是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32165361/