public static DisplayDataCollection Parse(FieldList source) { DisplayDataCollection res = new DisplayDataCollection(); if ((source != null) && (source.Count > 0)) { FieldListNavigator nav = new FieldListNavigator(source); if (nav.FindFirst(MessageOutFieldID.SlotDisplayDataTypeID)) { while (nav.CurrentID == (short)MessageOutFieldID.SlotDisplayDataTypeID) { DisplayType dt = (DisplayType)(nav.Current.AsByte() ?? (byte)DisplayType.Null); object data = null; short? signpost = null; if ((nav.Next != null) && (nav.Next.FieldID == (short)MessageOutFieldID.SlotDisplayData)) { switch (dt) { case DisplayType.Null: data = null; break; case DisplayType.String: data = nav.Next.AsString() ?? String.Empty; break; case DisplayType.Integer: data = nav.Next.AsNumber() ?? 0; break; case DisplayType.ContentReference: { FieldList fl = nav.Next as FieldList; if (fl != null) { data = new ContentReference(fl); } break; } case DisplayType.MediaMetaData: { FieldList fl = nav.Next as FieldList; if (fl != null) { data = new MediaMetaData(fl); } break; } } } // signpost if ((nav.NextNext != null) && (nav.NextNext.FieldID == (short)NaviAgentFieldID.Signpost)) { signpost = nav.NextNext.AsShort() ?? -1; if (signpost < 0) { signpost = null; } } res.Add(new DisplayData(dt, data, signpost)); if (!nav.FindNext(MessageOutFieldID.SlotDisplayDataTypeID)) { break; } } } } return(res); }