【发布时间】:2017-06-19 07:07:54
【问题描述】:
我想创建一个更受限制的MemberwiseClone 版本,但我意识到我自己的 C# 代码可以向对象添加属性的唯一方法是使用 dynamic,但这不能为对象提供与原本的。我的另一个更丑陋的选择是为新克隆发出源代码并在运行时编译它,但这会带来复杂性。为了简单起见,我不关心的程序集引用等。
现在我只使用MemberwiseClone,但我真的很好奇它是如何工作的。我找不到任何反编译的源代码。
【问题讨论】:
-
这些天你不需要反编译器。 reference source 将告诉您该方法是由运行时本身实现的(MethodImplOptions.InternalCall)。从那里你前往 CoreClr github repo 并搜索你的电话。在您的情况下,您最终会找到 this file,其中包含您感兴趣的实现 (ObjectNative::Clone)。
-
谢谢@thehennyy,我现在对如何在参考代码中查找内容有了更多了解,但我的 C++ 落后了我大约十年,我不知道
ObjectNative::Clone做了什么。我想知道这个问题是使用什么原理来克隆对象。看到它是C++,它是直接字节复制还是什么? -
世界上谁能发现这个问题“太宽泛”并投票结束?我在问一个非常具体的问题,只能得到非常有限的答案。标题就是问题;假装阅读。
-
thehennyy 已经找到了该方法的 C++ 源代码。它所做的是为克隆分配新的空对象,然后将内存从当前对象复制到为克隆分配的内存(通过 memcpy 或 memmove)。所以回答你的问题:它通过将内存从旧对象直接复制到新对象来工作。
-
谢谢@Evk,这是我一直在寻找的答案,有一点细节,比如它到底复制了什么,例如字段和属性?公开和私人等。让您评论答案,并尝试添加这些详细信息,您将获得赏金。
标签: c# dynamic reflection clone