通过Reflection.Emit创建没有构造函数的实例 - 可能吗?

时间:2014-04-02 09:32:45

标签: performance reflection constructor instance reflection.emit

我最近开始学习Reflection.Emit,所以我可以替换所有Activator用法,以便在我的代码中获得更好的性能。我现在正在考虑某种序列化和反序列化库。特别是对于反序列化,我想重新创建与序列化之前完全相同的对象状态(我假设序列化是100%正确的)。但是,例如可以有类,有多个构造函数,每个都做一些复杂的事情,因为这个对象有复杂的逻辑,必须以某种特定的方式进行初始化。但是当我序列化关于对象的所有内容时,我能做的最简单的事情是以某种方式绕过任何提供的ctors - 只需创建一个空对象并用数据填充所有字段。周期。

不幸的是,在OpCodes.Newobj中使用ILGenerator.Emit需要传递ConstructorInfo作为参数。对于结构,它很容易,因为它们总是具有默认的无参数ctor。然而,课程的不同之处在于。

我将不胜感激。

1 个答案:

答案 0 :(得分:3)

必须可以,因为BinaryFormatter在不调用构造函数的情况下创建对象。

您可以使用FormatterServices.GetSafeUninitializedObject。这可能受到最高安全要求的保护。