public void WritePrimitive(object value, Type valueType)
{
if (value == null)
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolNull);
}
else if (valueType == typeof(int))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolInt);
Write((int)value);
}
else if (valueType == typeof(bool))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolBool);
Write((bool)value);
}
else if (valueType == typeof(string))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolString);
Write((string)value);
}
else if (valueType == typeof(long))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolLong);
Write((long)value);
}
else if (valueType == typeof(double))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolDouble);
Write((double)value);
}
else if (valueType == typeof(DateTime))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolDateTime);
Write((DateTime)value);
}
else if (valueType == typeof(TimeSpan))
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolTimeSpan);
Write((TimeSpan)value);
}
else if (valueType == typeof (Uri))
{
writer.Write((int) ProtocolPrimitiveValue.ProtocolUri);
Write((Uri) value);
}
else if (typeof(IDictionary).IsAssignableFrom(valueType) ||
valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(IDictionary<,>))
{
writer.Write((int) ProtocolPrimitiveValue.ProtocolDict);
var dict = (IDictionary) value;
var keyType = valueType.GetGenericArguments()[0];
var valType = valueType.GetGenericArguments()[1];
WriteType(keyType);
WriteType(valType);
writer.Write(dict.Count);
foreach (DictionaryEntry pair in dict)
{
WritePrimitive(pair.Key, keyType);
WritePrimitive(pair.Value, valType);
}
}
else
{
var nt = Nullable.GetUnderlyingType(valueType);
if (nt != null)
{
writer.Write((int)ProtocolPrimitiveValue.ProtocolNullable);
WritePrimitive(value, nt);
}
else if (valueType.IsArray)
{
var arr = (Array) value;
writer.Write((int)ProtocolPrimitiveValue.ProtocolArray);
WriteType(valueType.GetElementType());
writer.Write(arr.Length);
foreach (object item in arr)
WritePrimitive(item, valueType.GetElementType());
}
else if (valueType.IsEnum)
{
WriteEnum(value, valueType);
}
else
{
throw new InvalidOperationException("Unsupported primitive type: " + valueType.FullName);
}
}
}