Exemple #1
0
        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);
        }