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);
}
}
}
}