private void WriteType(Type type)
{
if (type == typeof(int))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolInt);
}
else if (type == typeof(bool))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolBool);
}
else if (type == typeof(string))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolString);
}
else if (type == typeof(long))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolLong);
}
else if (type == typeof(double))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolDouble);
}
else if (type == typeof(DateTime))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolDateTime);
}
else if (type == typeof(TimeSpan))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolTimeSpan);
}
else if (type == typeof(Uri))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolUri);
}
else if (typeof(IDictionary).IsAssignableFrom(type))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolDict);
WriteType(type.GetGenericArguments()[0]);
WriteType(type.GetGenericArguments()[1]);
}
else
{
var nt = Nullable.GetUnderlyingType(type);
if (nt != null)
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolNullable);
WriteType(nt);
}
else if (type.IsArray)
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolArray);
WriteType(type.GetElementType());
}
else if (type.IsEnum)
{
var enumTypeId = registry.GetEnumId(type);
if (enumTypeId.HasValue)
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolRegisteredEnum);
writer.Write(enumTypeId.Value);
}
else
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolEnum);
writer.Write(type.AssemblyQualifiedName);
}
}
else
{
throw new InvalidOperationException("Unsupported primitive type: " + type.FullName);
}
}
}