コード例 #1
0
        public override void AppendWrite(ILGenerator generator, MessageField field)
        {
            var done = generator.DefineLabel();
            var tmp  = generator.DeclareLocal(typeof(Nullable <>).MakeGenericType(FieldType));

            generator.Emit(OpCodes.Ldloc_0);
            generator.Emit(OpCodes.Call, Property.GetGetMethod());
            generator.Emit(OpCodes.Stloc, tmp.LocalIndex);

            generator.Emit(OpCodes.Ldloca, tmp.LocalIndex);
            generator.Emit(OpCodes.Call, typeof(Nullable <>)
                           .MakeGenericType(FieldType)
                           .GetProperty("HasValue")
                           .GetGetMethod());

            generator.Emit(OpCodes.Brfalse_S, done);

            field.AppendGuard(generator, Property.GetGetMethod(), done);
            field.AppendHeader(generator);

            generator.Emit(OpCodes.Ldloca, tmp.LocalIndex);
            generator.Emit(OpCodes.Call, typeof(Nullable <>)
                           .MakeGenericType(FieldType)
                           .GetProperty("Value")
                           .GetGetMethod());

            field.AppendWriteField(generator);
            generator.Emit(OpCodes.Pop);
            generator.MarkLabel(done);
        }
コード例 #2
0
        public override void AppendWrite(ILGenerator generator, MessageField field)
        {
            var done = generator.DefineLabel();

            field.AppendGuard(generator, Property.GetGetMethod(), done);

            field.AppendHeader(generator);

            generator.Emit(OpCodes.Ldloc_0);
            generator.Emit(OpCodes.Call, Property.GetGetMethod());
            field.AppendWriteField(generator);
            generator.Emit(OpCodes.Pop);
            generator.MarkLabel(done);
        }