private void WritePrimitiveField(MemberInfo meminf, object value) { if (meminf.FieldType == typeof(string)) { WriteStringZeroTerminated((string)value); } else if (meminf.FieldType == typeof(int)) { Write((int)value); } else if (meminf.FieldType == typeof(uint)) { if (meminf.IsReference) WriteReference((uint)value, meminf.ReferencedFormKinds); else Write((uint)value); } else if (meminf.FieldType == typeof(long)) { Write((long)value); } else if (meminf.FieldType == typeof(ulong)) { Write((ulong)value); } else if (meminf.FieldType == typeof(short)) { Write((short)value); } else if (meminf.FieldType == typeof(ushort)) { Write((ushort)value); } else if (meminf.FieldType == typeof(char)) { segmentStream.WriteByte(Convert.ToByte((char)value)); } else if (meminf.FieldType == typeof(byte)) { segmentStream.WriteByte((byte)value); } else if (meminf.FieldType == typeof(float)) { if (meminf.IsFakeFloat) { Write((int)((float)value * 100)); } else { Write((float)value); } } else { throw new InvalidProgramException("Unsupported primitive field type: " + meminf.FieldType.FullName); } }
internal void WriteField(object target, MemberInfo meminfo) { var value = meminfo.GetValue(target); // Skip null fields right away (covers nullable primitive types) if (value == null) return; // Skip null form references (that are not a list of references) unless it is a required field if (meminfo.IsReference && !meminfo.IsListType && (uint)value == 0 && !meminfo.IsRequired) return; string fieldName = meminfo.FieldNames.First(); if (meminfo.IsPrimitiveType) { // Primitive types have only one propery name if (meminfo.IsListType) { foreach (var item in (IEnumerable)value) { BeginPropertySegment(fieldName); WritePrimitiveField(meminfo, item); EndSegment(); } } else { BeginPropertySegment(fieldName); WritePrimitiveField(meminfo, value); EndSegment(); } } else { if (meminfo.FieldType.IsSubclassOf(typeof(Compound))) { if (meminfo.IsListType) { foreach (var item in (IEnumerable)value) { WriteCompoundField((Compound)item); } } else { WriteCompoundField((Compound)value); } } else { if (meminfo.IsListType) { foreach (var item in (IEnumerable)value) { WriteStructuredField((Field)item, fieldName); } } else { WriteStructuredField((Field)value, fieldName); } } } }