private static object ReadValue(BufferedBinaryReader reader, SystemTypeCode type) { switch (type) { case SystemTypeCode.Boolean: return(reader.ReadBoolean()); case SystemTypeCode.Int8: return(reader.ReadInt8()); case SystemTypeCode.UInt8: return(reader.ReadUInt8()); case SystemTypeCode.Int16: return(reader.ReadInt16()); case SystemTypeCode.UInt16: return(reader.ReadUInt16()); case SystemTypeCode.Int32: return(reader.ReadInt32()); case SystemTypeCode.UInt32: return(reader.ReadUInt32()); case SystemTypeCode.Int64: return(reader.ReadInt64()); case SystemTypeCode.UInt64: return(reader.ReadUInt64()); case SystemTypeCode.Single: return(reader.ReadSingle()); case SystemTypeCode.Double: return(reader.ReadDouble()); case SystemTypeCode.Decimal: throw new NotImplementedException(); case SystemTypeCode.DateTime: throw new NotImplementedException(); case SystemTypeCode.Char: return(reader.ReadChar()); case SystemTypeCode.String: return(reader.ReadCountedUtf8()); case SystemTypeCode.Enum: throw new NotImplementedException(); default: throw new ArgumentOutOfRangeException(); } }
private object ReadValue(BufferedBinaryReader reader, IType type) { var st = type.SystemType(); if (st != null) { switch (st.Code) { case SystemTypeCode.Boolean: return reader.ReadBoolean(); case SystemTypeCode.Int8: return reader.ReadInt8(); case SystemTypeCode.UInt8: return reader.ReadUInt8(); case SystemTypeCode.Int16: return reader.ReadInt16(); case SystemTypeCode.UInt16: return reader.ReadUInt16(); case SystemTypeCode.Int32: return reader.ReadInt32(); case SystemTypeCode.UInt32: return reader.ReadUInt32(); case SystemTypeCode.Int64: return reader.ReadInt64(); case SystemTypeCode.UInt64: return reader.ReadUInt64(); case SystemTypeCode.Single: return reader.ReadSingle(); case SystemTypeCode.Double: return reader.ReadDouble(); case SystemTypeCode.Char: return reader.ReadChar(); case SystemTypeCode.String: return reader.ReadCountedUtf8(); case SystemTypeCode.Object: //boxed value type var e = (ElementType)reader.ReadInt8(); return ReadValue(reader, e); case SystemTypeCode.Type: return ReadType(reader); } } if (type.TypeKind == TypeKind.Enum) { return ReadValue(reader, type.ValueType); } if (type.IsArray) { int numElem = reader.ReadInt32(); Array arr = null; for (int i = 0; i < numElem; ++i) { var val = ReadValue(reader, type.ElementType); if (arr == null) arr = Array.CreateInstance(val.GetType(), numElem); arr.SetValue(val, i); } return arr; } return null; }
private object ReadValue(BufferedBinaryReader reader, ElementType e) { switch (e) { case ElementType.Boolean: return reader.ReadBoolean(); case ElementType.Char: return reader.ReadChar(); case ElementType.Int8: return reader.ReadSByte(); case ElementType.UInt8: return reader.ReadByte(); case ElementType.Int16: return reader.ReadInt16(); case ElementType.UInt16: return reader.ReadUInt16(); case ElementType.Int32: return reader.ReadInt32(); case ElementType.UInt32: return reader.ReadUInt32(); case ElementType.Int64: return reader.ReadInt64(); case ElementType.UInt64: return reader.ReadUInt64(); case ElementType.Single: return reader.ReadSingle(); case ElementType.Double: return reader.ReadDouble(); case ElementType.String: return reader.ReadCountedUtf8(); case ElementType.Object: case ElementType.CustomArgsBoxedObject: { var elem = (ElementType)reader.ReadInt8(); return ReadValue(reader, elem); } case ElementType.CustomArgsEnum: { string enumTypeName = reader.ReadCountedUtf8(); var enumType = FindType(enumTypeName); if (enumType == null) { //TODO: throw new BadMetadataException(); } return ReadValue(reader, enumType); } case ElementType.CustomArgsType: return ReadType(reader); case ElementType.ArraySz: { var arrElemType = (ElementType)reader.ReadInt8(); return ReadArray(reader, arrElemType); } default: throw new ArgumentOutOfRangeException(); } }