- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的问题相对简单,我感觉 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/
我的问题相对简单,我感觉 GetUninitializedObject(type) 方法不会在不调用任何构造函数的情况下生成给定类型的新实例,而是生成一个新的对象,它的行为与正确的对象相同(具有相同的
通常我会调用 Expression.New(type),但是当类型没有无参数构造函数时,这是不可能的。 FormatterServices.GetUninitializedObject() 在内部如何
FormatterServices.GetSerializableMembers为派生类型返回两次 protected 字段和内部字段。一次作为 SerializationFieldInfo 的实例,
是否有其他方法可以在 UWP (NETCore) 中创建“未初始化”对象?我正在尝试移植一段使用 对象 o = FormatterServices.GetUninitializedObject(类型)
我是一名优秀的程序员,十分优秀!