FormatterServices.GetUninitializedObject 如何在内部工作
本文关键字:在内部 工作 GetUninitializedObject FormatterServices | 更新日期: 2023-09-27 18:32:40
我的问题相对简单,我感觉 GetUninitializedObject( type( 方法不会在不调用任何构造函数的情况下生成给定类型的新实例,而是生成一个新对象,其行为类似于正确的对象(具有相同的结构(并且显然具有相同的类型(但内部仍然是对象(。
我这么说是因为最近我尝试使用 GetUninitializedObject 克隆一个 Form.Button,以生成我在该操作期间需要的类型的新实例(我在源对象上递归操作(,我的结果具有正确的结构(并且即时窗口也说它具有正确的类型(,但是如果我尝试执行 MyForm.Components.Add(克隆按钮(,我会收到一条带有消息的异常: "无法将类型'System.Object'的对象转换为类型'ControlCollection'"(但是我已经检查了clonedButton类型是Button,它的继承也是正确的,手动我已经检查了几乎所有的结构,在克隆的按钮内,并与源Button对象匹配,我已经访问了公共和私有字段(。
所以这就是我问题的原因(因为我在 javascript 中遇到了类似的问题,在相同的克隆上下文中,当我生成对象表单基础对象,然后添加具有正确名称和结构的字段时,编译器发现了我的技巧观察每个实例的调用构造函数是什么,所以我认为这可能是类似的情况(, 如果有人能向我解释 GetUninitializedObject(( 背后的魔术,它应该会有很大帮助(提前感谢(。
(但内部仍然是对象(
不,他们没有。你已经对你所看到的行为提出了一个合理的解释,但这不是正确的解释。
您从FormatterServices.GetUninitializedObject(typeof(Button))
获得的Button
是一个真正的Button
,除了尚未调用其构造函数之外,它在各个方面的行为都与任何其他Button
相似。问题在于,当Button
构造函数未被调用时,它的设计并不重要,而且您伪造它的尝试与真实内容不够接近。
通过在未初始化的对象上显式调用构造函数,可以看到该按钮是一个真正的Button
:
var button = (Button)FormatterServices.GetUninitializedObject(typeof(Button));
var constructor = typeof(Button).GetConstructor(Type.EmptyTypes);
constructor.Invoke(button, null);
您将能够使用此按钮执行其他操作的所有操作。