FormatterServices.GetUninitializedObject如何在内部工作?

时间:2013-09-23 20:54:57

标签: c# clone

我的问题相对简单,我感觉方法GetUninitializedObject(type)不生成给定类型的新实例而不调用任何构造函数但生成一个新的Object,其作用与正确的一样(具有相同的)结构)并且显然具有相同的类型(但内部仍然是对象)。

我说是因为最近我尝试使用GetUninitializedObject克隆一个Form.Button来生成我在该操作中需要的类型的新实例(我在源对象上递归操作),我的结果具有正确的结构(并且即时窗口也说它具有正确的类型)但是如果我尝试做MyForm.Components.Add(clonedButton)我收到一个带有消息的异常:“无法将'System.Object'类型的对象强制转换为'ControlCollection'” (但我检查了clonedButton类型是Button,它的继承也是正确的,手动我检查几乎所有结构,克隆按钮内部,并匹配源Button对象,我已访问pubblic和私有字段)。

所以这就是为什么我的问题(因为我在javascript中有类似的问题,在同一个clonation上下文中我生成对象形式基础对象然后添加具有正确名称和结构的字段,编译器发现我的伎俩观看什么是每个实例的被调用的构造函数,所以我认为它可能是类似的情况),如果有人能解释我GetUninitializedObject()背后的魔法,它应该有所帮助(提前感谢)。

1 个答案:

答案 0 :(得分:23)

  

(但内部仍为对象)

不,他们没有。你已经对你所看到的行为提出了合理的解释,但这不是正确的解释。

您从Button获得的FormatterServices.GetUninitializedObject(typeof(Button))是一个真实的Button,除了没有调用其构造函数外,其他所有方面都与其他Button一样。问题是Button在没有调用构造函数的情况下不能正常工作,并且你伪造它的尝试与真实的东西不够接近。

通过显式调用未初始化对象上的构造函数,您可以看到该按钮是真实的Button

var button = (Button)FormatterServices.GetUninitializedObject(typeof(Button));
var constructor = typeof(Button).GetConstructor(Type.EmptyTypes);
constructor.Invoke(button, null);

您将可以使用此按钮执行所有操作。