在运行时,我找到了我想要创建实例的对象的类型:
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动态可以解决这个问题,那么在这种情况下就没用了。)
答案 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编译的费用,但是每次调用该方法都不会产生比使用任何其他委托更多的开销。