gpt4 book ai didi

c# - FormatterServices.GetUninitializedObject 如何在内部工作?

转载 作者:可可西里 更新时间:2023-11-01 07:53:46 26 4
gpt4 key购买 nike

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

我这么说是因为最近我尝试使用 GetUninitializedObject 克隆一个 Form.Button 以生成我在该操作期间所需类型的新实例(我对源对象进行递归操作),我的结果具有正确的结构(并且即时窗口也说它具有正确的类型)但是如果我尝试执行 MyForm.Components.Add(clonedButton),我会收到一条异常消息:“无法将类型为‘System.Object’的对象转换为类型‘ControlCollection’” (但我已经检查了克隆按钮类型是 Button 并且它的继承也是正确的,我手动检查了克隆按钮内的几乎所有结构,并与源 Button 对象匹配并且我已经访问了公共(public)和私有(private)字段).

所以这就是我的问题的原因(因为我在 javascript 中遇到了类似的问题,在相同的克隆上下文中,我生成对象形式的基本对象,然后添加具有正确名称和结构的字段,编译器发现了我的技巧每个实例的调用构造函数是什么,所以我认为它可能是类似的情况),如果有人能向我解释 GetUninitializedObject() 背后的魔法,它应该会有很大帮助(提前致谢)。

最佳答案

(but internally remain an Object)

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

您从 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);

您将能够使用此按钮执行您可以通过其他方式执行的所有操作。

关于c# - FormatterServices.GetUninitializedObject 如何在内部工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18968703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com