public void LoadTables() { var tables = RecordsAssembly.GetTypes().Where(x => x.GetInterface("ITable") != null).ToArray(); var orderedTables = new Type[tables.Length]; var dontCatch = new List <Type>(); foreach (var table in tables) { var attribute = (TableAttribute)table.GetCustomAttribute(typeof(TableAttribute), false); if (attribute == null) { logger.Write(string.Format("Warning : the table type '{0}' hasn't got an attribute called 'TableAttribute'", table.Name), MessageState.WARNING); continue; } if (attribute.catchAll) { if (attribute.readingOrder >= 0) { orderedTables[attribute.readingOrder] = table; } } else { dontCatch.Add(table); } } foreach (var table in tables) { if (orderedTables.Contains(table) || dontCatch.Contains(table)) { continue; } for (var i = tables.Length - 1; i >= 0; i--) { if (orderedTables[i] == null) { orderedTables[i] = table; break; } } } foreach (var type in orderedTables) { if (type == null) { continue; } var reader = Activator.CreateInstance(typeof(DatabaseReader <>).MakeGenericType(type)); var tableName = (string)reader.GetType().GetProperty("TableName").GetValue(reader); logger.Write("Loading " + tableName + " ..."); var method = reader.GetType().GetMethods().FirstOrDefault(x => x.Name == "Read" && x.GetParameters().Length == 1); method.Invoke(reader, new object[] { this.UseProvider() }); var elements = reader.GetType().GetProperty("Elements").GetValue(reader); var field = ITableManager.GetCache(type); if (field != null) { field.FieldType.GetMethod("AddRange").Invoke(field.GetValue(null), new object[] { elements });; } } }