/// <summary> /// Adds the <paramref name="record"/> as a child. /// </summary> /// <param name="frhi">The <see cref="FileRecordHierarchyItem"/> configuration.</param> /// <param name="record">The <see cref="FileRecord"/>.</param> /// <returns>The corresponding <see cref="FileRecordHierarchyLinker"/>.</returns> public FileRecordHierarchyLinker AddChild(FileRecordHierarchyItem frhi, FileRecord record) { var list = GetChildList(record.RecordIdentifier); var item = new FileRecordHierarchyLinker(frhi, this, list.Count); list.Add(item); return(item); }
/// <summary> /// Initializes a new instance of the <see cref="FileRecordHierarchyLinker"/> class. /// </summary> /// <param name="frhi">The <see cref="FileRecordHierarchyLinker"/>.</param> /// <param name="parent">The parent <see cref="FileRecordHierarchyLinker"/>.</param> /// <param name="index">The <see cref="Index"/> for the record.</param> internal FileRecordHierarchyLinker(FileRecordHierarchyItem frhi, FileRecordHierarchyLinker parent, int index) { RecordIdentifier = frhi.RecordIdentifier; Parent = parent; Index = index; foreach (var child in frhi.Children) { _children.Add(child.Key, new List <FileRecordHierarchyLinker>()); } }
/// <summary> /// Gets the underlying hierarchy for an item. /// </summary> private static void Get(FileFormatBase fileFormat, Dictionary <string, FileRecordHierarchyItem> dict, FileRecordHierarchyItem item, PropertyInfo pi) { if (dict.ContainsKey(item.RecordIdentifier)) { throw new InvalidOperationException(string.Format("Type '{0}' property '{1}' FileHierarchyAttribute has a duplicate Record Identifier '{2}'; must be unique within hierarchy).", pi.DeclaringType.Name, pi.Name, item.RecordIdentifier)); } if (fileFormat.HeaderRecordIdentifier != null && item.RecordIdentifier == fileFormat.HeaderRecordIdentifier) { throw new InvalidOperationException(string.Format("Type '{0}' property '{1}' FileHierarchyAttribute has a duplicate Record Identifier '{2}'; must be different to the Header Record Identifier).", pi.DeclaringType.Name, pi.Name, item.RecordIdentifier)); } if (fileFormat.TrailerRecordIdentifier != null && item.RecordIdentifier == fileFormat.TrailerRecordIdentifier) { throw new InvalidOperationException(string.Format("Type '{0}' property '{1}' FileHierarchyAttribute has a duplicate Record Identifier '{2}'; must be different to the Trailer Record Identifier).", pi.DeclaringType.Name, pi.Name, item.RecordIdentifier)); } dict.Add(item.RecordIdentifier, item); if (item.RecordReflector.Children == null || item.RecordReflector.Children.Length == 0) { return; } foreach (var fhr in item.RecordReflector.Children) { var frhh = new FileRecordHierarchyItem { RecordIdentifier = fhr.RecordIdentifier, Level = item.Level + 1, Parent = item, RecordReflector = fileFormat.GetFileRecordReflector(fhr.PropertyType), HierarchyReflector = fhr }; Get(fileFormat, dict, frhh, fhr.PropertyInfo); item.Children.Add(frhh.RecordIdentifier, frhh); } }