void EmitWriteField(ILGenerator il, LocalBuilder writer, LocalBuilder instance, FieldInfo field)
{
Type fieldType = field.FieldType;
if (fieldType.IsValueType) {
if (fieldType.IsPrimitive || fieldType.IsEnum) {
il.Emit(OpCodes.Ldloc, writer); // writer
il.Emit(OpCodes.Ldloc, instance); // writer, instance
il.Emit(OpCodes.Ldfld, field); // writer, instance.field
WritePrimitiveValue(il, fieldType);
} else {
il.Emit(OpCodes.Ldloc, instance); // instance
il.Emit(OpCodes.Ldfld, field); // instance.field
EmitWriteValueType(il, writer, fieldType);
}
} else {
il.Emit(OpCodes.Ldarg_0); // context
il.Emit(OpCodes.Ldloc, instance); // context, instance
il.Emit(OpCodes.Ldfld, field); // context, instance.field
il.Emit(OpCodes.Call, writeObjectID); // context.WriteObjectID(instance.field);
}
}