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

时间:2013-07-24 14:19:03

标签: c# .net dynamic reflection

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

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

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

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

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

有没有办法将deserialized分配给theInstance,而不使用反射循环使用该类型的属性?因为这对时间至关重要:假设唯一的方法就是反思,有没有办法将性能损失降到最低?我确实希望在短时间内完成许多这些对象。

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

1 个答案:

答案 0 :(得分:0)

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

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编译的费用,但是每次调用该方法都不会产生比使用任何其他委托更多的开销。