private void GenerateGetObjectDataMethod() { ParameterSpec[] getObjDataParams = new ParameterSpec[] { new ParameterSpec("info", typeof(System.Runtime.Serialization.SerializationInfo)), new ParameterSpec("context", typeof(System.Runtime.Serialization.StreamingContext)) }; MethodBuilder getObjectDataMethod = m_ilEmitHelper.AddMethod(m_builder, "GetObjectData", getObjDataParams, new TypeContainer(typeof(void)), MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.HideBySig); ILGenerator body = getObjectDataMethod.GetILGenerator(); MethodInfo addValueMethod = typeof(System.Runtime.Serialization.SerializationInfo).GetMethod("AddValue", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { ReflectionHelper.StringType, ReflectionHelper.ObjectType, ReflectionHelper.TypeType }, new ParameterModifier[0]); MethodInfo getTypeFromH = ReflectionHelper.TypeType.GetMethod("GetTypeFromHandle", BindingFlags.Public | BindingFlags.Static); Label beforeReturn = body.DefineLabel(); // serialize initalized field GenerateAddFieldToObjectData(m_initalizedField, body, addValueMethod, getTypeFromH); // nothing more to do, if not initalized, therefore check here body.Emit(OpCodes.Ldarg_0); body.Emit(OpCodes.Ldfld, m_initalizedField); // fieldvalue body.Emit(OpCodes.Brfalse, beforeReturn); // initalized -> serialise discriminator and corresponding value GenerateAddFieldToObjectData(m_discrField, body, addValueMethod, getTypeFromH); // now serialize field corresponding to discriminator value // do this by using a switch structure GenerateInsertIntoInfoForDiscAction action = new GenerateInsertIntoInfoForDiscAction(this, addValueMethod, getTypeFromH); GenerateSwitchForDiscriminator(body, action, beforeReturn); body.MarkLabel(beforeReturn); body.Emit(OpCodes.Ret); }
private void GenerateGetObjectDataMethod() { ParameterSpec[] getObjDataParams = new ParameterSpec[] { new ParameterSpec("info", typeof(System.Runtime.Serialization.SerializationInfo)), new ParameterSpec("context", typeof(System.Runtime.Serialization.StreamingContext)) }; MethodBuilder getObjectDataMethod = m_ilEmitHelper.AddMethod(m_builder, "GetObjectData", getObjDataParams, new TypeContainer(typeof(void)), MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.HideBySig); ILGenerator body = getObjectDataMethod.GetILGenerator(); MethodInfo addValueMethod = typeof(System.Runtime.Serialization.SerializationInfo).GetMethod("AddValue", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { ReflectionHelper.StringType, ReflectionHelper.ObjectType, ReflectionHelper.TypeType }, new ParameterModifier[0]); MethodInfo getTypeFromH = ReflectionHelper.TypeType.GetMethod("GetTypeFromHandle", BindingFlags.Public | BindingFlags.Static); Label beforeReturn = body.DefineLabel(); // serialize initalized field GenerateAddFieldToObjectData(m_initalizedField, body, addValueMethod, getTypeFromH); // nothing more to do, if not initalized, therefore check here body.Emit(OpCodes.Ldarg_0); body.Emit(OpCodes.Ldfld, m_initalizedField); // fieldvalue body.Emit(OpCodes.Brfalse, beforeReturn); // initalized -> serialise discriminator and corresponding value GenerateAddFieldToObjectData(m_discrField, body, addValueMethod, getTypeFromH); // now serialize field corresponding to discriminator value // do this by using a switch structure GenerateInsertIntoInfoForDiscAction action = new GenerateInsertIntoInfoForDiscAction(this, addValueMethod, getTypeFromH); GenerateSwitchForDiscriminator(body, action, beforeReturn); body.MarkLabel(beforeReturn); body.Emit(OpCodes.Ret); }