void EmitReadField(ILGenerator il, LocalBuilder reader, LocalBuilder instance, FieldInfo field)
{
Type fieldType = field.FieldType;
if (fieldType.IsValueType) {
if (fieldType.IsPrimitive || fieldType.IsEnum) {
il.Emit(OpCodes.Ldloc, instance); // instance
ReadPrimitiveValue(il, reader, fieldType); // instance, value
il.Emit(OpCodes.Stfld, field); // instance.field = value;
} else {
il.Emit(OpCodes.Ldloc, instance); // instance
il.Emit(OpCodes.Ldflda, field); // &instance.field
EmitReadValueType(il, reader, fieldType);
}
} else {
il.Emit(OpCodes.Ldloc, instance); // instance
il.Emit(OpCodes.Ldarg_0); // instance, context
il.Emit(OpCodes.Call, readObject); // instance, context.ReadObject()
il.Emit(OpCodes.Castclass, fieldType);
il.Emit(OpCodes.Stfld, field); // instance.field = (fieldType) context.ReadObject();
}
}