private static FileState ParseFile(File3dm file, DataStore store, RvcVersion version, out ChangeSet changes)
        {
            FileState             state           = null;
            List <IFileDataTable> parsedTableList = new List <IFileDataTable>();
            //opening the store, and the file and comparing the contents
            List <Type>        memberTypes;
            List <string>      tableNames;
            List <IEnumerable> tables3dm   = GetAllTables(file, out memberTypes, out tableNames);
            ChangeSet          fileChanges = new ChangeSet();

            for (int i = 0; i < tables3dm.Count; i++)
            {
                ChangeSet      tableChanges;
                IFileDataTable parsedTable = TableUtil.ParseTableData(tables3dm[i], tableNames[i], memberTypes[i], version, store, out tableChanges);
                parsedTableList.Add(parsedTable);
                fileChanges = ChangeSet.Merge(fileChanges, tableChanges);
            }

            //populating the file state
            state = new FileState(store, version.AddDownStreamVersion(fileChanges));
            foreach (var table in parsedTableList)
            {
                state.Tables.Add(table);
            }
            changes = fileChanges;
            return(state);
        }
        public static List <IEnumerable> GetAllTables(File3dm file, out List <Type> memberTypes, out List <string> names)
        {
            var props = typeof(File3dm).GetProperties();
            List <IEnumerable> tables = new List <IEnumerable>();

            memberTypes = new List <Type>();
            names       = new List <string>();
            foreach (var p in props)
            {
                Type memberType;
                var  match = TableUtil.IsFile3dmTableType(p.PropertyType, out memberType);
                if (!match)
                {
                    continue;
                }
                memberTypes.Add(memberType);
                names.Add(p.Name);
                var table = p.GetValue(file);
                tables.Add((IEnumerable)table);
            }

            return(tables);
        }