Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FormatterServices.GetUninitializedObject如何在内部工作?_C#_Clone - Fatal编程技术网

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

C# FormatterServices.GetUninitializedObject如何在内部工作?,c#,clone,C#,Clone,我的问题相对简单,我感觉方法GetUninitializedObject(type)不会在不调用任何构造函数的情况下生成给定类型的新实例,而是生成一个新对象,该对象的行为与正确的对象类似(具有相同的结构),并且显然具有相同的类型(但内部仍然是一个对象) 我这么说是因为最近我尝试克隆一个Form.Button,使用GetUninitializedObject生成我在操作期间需要的类型的新实例(我递归地操作源对象),我的结果具有正确的结构(即时窗口也说它具有正确的类型),但是如果我尝试执行MyFor

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

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

这就是我的问题的原因(因为我在javascript中遇到了一个类似的问题,在相同的克隆上下文中,我从基本对象生成对象,然后添加具有正确名称和结构的字段,编译器发现了我的诀窍,观察每个实例的所谓构造函数,所以我认为这可能是类似的情况),如果有人能向我解释GetUninitializedObject()背后的神奇之处,应该会有很大帮助(提前谢谢)

(但内部仍然是一个对象)

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

FormatterServices.GetUninitializedObject(typeof(Button))获得的
按钮
是一个真正的
按钮
,除了它的构造函数没有被调用之外,它的行为在所有方面都与任何其他
按钮
类似。问题是
按钮
的设计不能在它的构造函数没有被调用时起作用,并且你试图伪造它的行为与真实的东西不够接近

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

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

使用此按钮,您将能够完成其他操作所能完成的所有操作。

我确信您也无法将按钮强制转换为ControlCollection;)请显示有问题的代码行。它严重违反了适用于您自己在C#中编写的任何代码的规则。它创建了一个对象而不调用构造函数。托管代码中非常大,不支持二进制反序列化所需。@Vitor您是对的,我在问题的正文中错误地键入了方法名称