private Tuple<ProtocolPrimitiveValue, Type> ReadType()
{
var primitiveType = (ProtocolPrimitiveValue)ReadInt();
switch (primitiveType)
{
case ProtocolPrimitiveValue.ProtocolBool:
return Tuple.Create(primitiveType, typeof (bool));
case ProtocolPrimitiveValue.ProtocolInt:
return Tuple.Create(primitiveType, typeof (int));
case ProtocolPrimitiveValue.ProtocolLong:
return Tuple.Create(primitiveType, typeof (long));
case ProtocolPrimitiveValue.ProtocolDouble:
return Tuple.Create(primitiveType, typeof (double));
case ProtocolPrimitiveValue.ProtocolString:
return Tuple.Create(primitiveType, typeof (string));
case ProtocolPrimitiveValue.ProtocolUri:
return Tuple.Create(primitiveType, typeof (Uri));
case ProtocolPrimitiveValue.ProtocolDateTime:
return Tuple.Create(primitiveType, typeof (DateTime));
case ProtocolPrimitiveValue.ProtocolTimeSpan:
return Tuple.Create(primitiveType, typeof (TimeSpan));
case ProtocolPrimitiveValue.ProtocolEnum:
var typeName = ReadString();
return Tuple.Create(primitiveType, Type.GetType(typeName));
case ProtocolPrimitiveValue.ProtocolRegisteredEnum:
var typeId = ReadInt();
return Tuple.Create(primitiveType, registry.GetEnumType(typeId));
case ProtocolPrimitiveValue.ProtocolNullable:
var inner = ReadType();
return Tuple.Create(primitiveType, typeof (Nullable<>).MakeGenericType(inner.Item2));
case ProtocolPrimitiveValue.ProtocolArray:
var elemType = ReadType();
return Tuple.Create(primitiveType, elemType.Item2.MakeArrayType());
case ProtocolPrimitiveValue.ProtocolDict:
var keyType = ReadType();
var valType = ReadType();
return Tuple.Create(primitiveType,
typeof (Dictionary<,>).MakeGenericType(keyType.Item2, valType.Item2));
case ProtocolPrimitiveValue.ProtocolNull:
return Tuple.Create(primitiveType, typeof (object));
default:
throw new ArgumentOutOfRangeException("primitiveType");
}
}