private void WriteValueType(Type formalType, object value)
{
CheckLegality(value, parentObjects);
// value type -> actual type is the formal type
if(formalType.IsEnum)
{
var underlyingType = Enum.GetUnderlyingType(formalType);
var convertedValue = Convert.ChangeType(value, underlyingType);
var method = writer.GetType().GetMethod("Write", new [] { underlyingType });
method.Invoke(writer, new[] { convertedValue });
return;
}
var nullableActualType = Nullable.GetUnderlyingType(formalType);
if(nullableActualType != null)
{
if(value != null)
{
writer.Write(true);
WriteValueType(nullableActualType, value);
}
else
{
writer.Write(false);
}
return;
}
if(Helpers.IsWriteableByPrimitiveWriter(formalType))
{
writer.Write((dynamic)value);
return;
}
// so we guess it is struct
WriteObjectsFields(value, formalType);
}