public IEnumerable GetContents() { var chars = TypeTag.ToArray(); var activeArrays = new Stack <ArrayList>(); using (var reader = new BigEndianReader(GetContentStream())) { for (int i = 1; i < chars.Length; i++) { object content; switch (chars[i]) { case Osc.TypeTag.Int32: content = reader.ReadInt32(); break; case Osc.TypeTag.Float: content = reader.ReadSingle(); break; case Osc.TypeTag.String: case Osc.TypeTag.Alternate: content = MessageParser.ReadString(reader); break; case Osc.TypeTag.Blob: content = MessageParser.ReadBlob(reader); break; case Osc.TypeTag.Int64: content = reader.ReadInt64(); break; case Osc.TypeTag.TimeTag: content = MessageParser.ReadTimeTag(reader); break; case Osc.TypeTag.Double: content = reader.ReadDouble(); break; case Osc.TypeTag.Char: content = MessageParser.ReadChar(reader); break; case Osc.TypeTag.True: content = true; break; case Osc.TypeTag.False: content = false; break; case Osc.TypeTag.Infinitum: content = float.PositiveInfinity; break; case Osc.TypeTag.ArrayBegin: activeArrays.Push(new ArrayList()); continue; case Osc.TypeTag.ArrayEnd: var array = activeArrays.Pop(); content = array.ToArray(); break; default: case Osc.TypeTag.Nil: content = null; break; } if (activeArrays.Count > 0) { var array = activeArrays.Peek(); array.Add(content); } else { yield return(content); } } } }