1

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

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

这工作正常,在调试器中我可以看到所有属性值——我假设调试器使用反射?

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

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

有没有一种方法可以分配deserializedtheInstance,而无需使用反射循环遍历类型的属性?由于这将是时间紧迫的:假设这样做的唯一方法是反射,有没有办法最小化性能损失?我确实希望在短时间内有很多这样的对象。

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

4

1 回答 1

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

于 2013-07-24T14:27:03.493 回答