/// <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>());
            }
        }
Пример #3
0
        /// <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);
            }
        }