示例#1
0
        private static ObjectReader GetDelegate(Type type, FieldInfo[] fields, Serializer serializer)
        {
            var c                       = new IlCompiler <ObjectReader>();
            var stream                  = c.Parameter <Stream>("stream");
            var session                 = c.Parameter <DeserializerSession>("session");
            var newExpression           = c.NewObject(type);
            var target                  = c.Variable <object>("target");
            var assignNewObjectToTarget = c.WriteVar(target, newExpression);

            c.Emit(assignNewObjectToTarget);

            var size         = c.Constant(16);
            var buffer       = c.Variable <byte[]>(DefaultCodeGenerator.PreallocatedByteBuffer);
            var bufferValue  = c.Call(typeof(DeserializerSession).GetMethod("GetBuffer"), session, size);
            var assignBuffer = c.WriteVar(buffer, bufferValue);

            c.Emit(assignBuffer);

            var typedTarget = c.CastOrUnbox(target, type);

            foreach (var field in fields)
            {
                var s    = serializer.GetSerializerByType(field.FieldType);
                var read = s.EmitReadValue(c, stream, session, field);

                var assignReadToField = c.WriteField(field, typedTarget, read);
                c.Emit(assignReadToField);
            }
            c.Emit(target);

            var readAllFields = c.Compile();

            return(readAllFields);
        }