protected void ImplementGetObjectData(ClassEmitter emitter) { var getObjectData = emitter.CreateMethod("GetObjectData", typeof(void), new[] { typeof(SerializationInfo), typeof(StreamingContext) }); var info = getObjectData.Arguments[0]; var typeLocal = getObjectData.CodeBuilder.DeclareLocal(typeof(Type)); getObjectData.CodeBuilder.AddStatement( new AssignStatement( typeLocal, new MethodInvocationExpression( null, TypeMethods.StaticGetType, new ConstReference(typeof(ProxyObjectReference).AssemblyQualifiedName).ToExpression(), new ConstReference(1).ToExpression(), new ConstReference(0).ToExpression()))); getObjectData.CodeBuilder.AddStatement( new ExpressionStatement( new MethodInvocationExpression( info, SerializationInfoMethods.SetType, typeLocal.ToExpression()))); foreach (var field in emitter.GetAllFields()) { if (field.Reference.IsStatic) { continue; } if (field.Reference.IsNotSerialized) { continue; } AddAddValueInvocation(info, getObjectData, field); } var interfacesLocal = getObjectData.CodeBuilder.DeclareLocal(typeof(string[])); getObjectData.CodeBuilder.AddStatement( new AssignStatement( interfacesLocal, new NewArrayExpression(interfaces.Length, typeof(string)))); for (var i = 0; i < interfaces.Length; i++) { getObjectData.CodeBuilder.AddStatement( new AssignArrayStatement( interfacesLocal, i, new ConstReference(interfaces[i].AssemblyQualifiedName).ToExpression())); } getObjectData.CodeBuilder.AddStatement( new ExpressionStatement( new MethodInvocationExpression( info, SerializationInfoMethods.AddValue_Object, new ConstReference("__interfaces").ToExpression(), interfacesLocal.ToExpression()))); getObjectData.CodeBuilder.AddStatement( new ExpressionStatement( new MethodInvocationExpression( info, SerializationInfoMethods.AddValue_Object, new ConstReference("__baseType").ToExpression(), new ConstReference(emitter.BaseType.AssemblyQualifiedName).ToExpression()))); getObjectData.CodeBuilder.AddStatement( new ExpressionStatement( new MethodInvocationExpression( info, SerializationInfoMethods.AddValue_Object, new ConstReference("__proxyGenerationOptions").ToExpression(), emitter.GetField("proxyGenerationOptions").ToExpression()))); getObjectData.CodeBuilder.AddStatement( new ExpressionStatement( new MethodInvocationExpression(info, SerializationInfoMethods.AddValue_Object, new ConstReference("__proxyTypeId").ToExpression(), new ConstReference(proxyTypeId).ToExpression()))); CustomizeGetObjectData(getObjectData.CodeBuilder, info, getObjectData.Arguments[1], emitter); getObjectData.CodeBuilder.AddStatement(new ReturnStatement()); }