我的问题相对简单,我感觉方法GetUninitializedObject(type)不生成给定类型的新实例而不调用任何构造函数但生成一个新的Object,其行为与正确的一样(具有相同的结构)和显然有相同的类型(但内部仍然是一个对象).
我说是因为最近我尝试使用GetUninitializedObject克隆一个Form.Button来生成我在该操作中需要的类型的新实例(我在源对象上递归操作),我的结果具有正确的结构(和即时窗口)也说它有正确的类型)但如果我尝试做MyForm.Components.Add(clonedButton)我收到一个带有消息的异常:"无法将'System.Object'类型的对象强制转换为'ControlCollection'"(但是我已经检查了clonedButton类型是Button,它的继承也是正确的,手动我检查几乎所有的结构,在克隆按钮内,并匹配源Button对象,我已访问pubblic和private字段).
所以这就是为什么我的问题(因为我在javascript中有类似的问题,在同一个克隆上下文中我生成对象形式基础对象然后添加具有正确名称和结构的字段,编译器发现我的技巧看着什么是调用每个实例的构造函数,所以我认为它可能是一个类似的情况),如果有人能解释我GetUninitializedObject()背后的魔法它应该帮助很多(提前谢谢).
小智 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);
Run Code Online (Sandbox Code Playgroud)
并且您可以使用此按钮执行所有操作,否则您可以执行此操作.
| 归档时间: |
|
| 查看次数: |
3268 次 |
| 最近记录: |