在运行时,我会找到要创建实例的对象类型:
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编译支付一次费用,但每次调用该方法都不会比使用任何其他委托产生更多的开销。