将动态反序列化的值分配给动态创建的实例

本文关键字:动态 创建 实例 反序列化 分配 | 更新日期: 2023-09-27 18:24:55

在运行时,我会找到要创建实例的对象类型:

string typeName = "myNamespace.type, assembly";
Type theType = Type.GetType(typeName);
// the type features a constructor w/o arguments:
object theInstance = Acivator.CreateInstance(theType);

这很好,在调试器中我可以看到所有的属性值——我确实假设调试器使用反射?

我还有一个object类型的动态反序列化对象,我知道它实际上是type:类型的

// pseudo code on the rhs of the "="
object deserialized = decoder.decode(serializedObject.body);

有没有一种方法可以将deserialized分配给theInstance,而不使用反射在类型的属性上循环?由于这将是时间关键的:假设唯一的方法是反思,有没有办法将性能损失降至最低?我确实预计在短时间内会有很多这样的物体。

(这是.Net 3.5,所以如果Type dynamic可以解决这个问题,那么在这种情况下就没有用了)。

将动态反序列化的值分配给动态创建的实例

最简单的方法是编写一个方法,将属性从一个此类对象复制到另一个对象:

static void CopyAttributesOnto(theType dest, theType source)
{
    dest.a = source.a;
    dest.b = source.b;
    // ...
}
// Then you can just do this:
CopyAttributesOnto((theType)theInstance, (theType)deserialized);

另一种选择是在运行时构建一个DynamicMethod,并从中创建一个委托。您将为新方法的反射和JIT编译支付一次费用,但每次调用该方法都不会比使用任何其他委托产生更多的开销。