创建包含类对象数组的类的实例
本文关键字:实例 数组 包含类 对象 创建 | 更新日期: 2023-09-27 18:35:31
在我深入研究我的问题之前,我想我应该给出一些关于我在做什么的背景。
我正在使用MapInfo的脚本语言MapBasic进行基于GIS的开发项目。我正在使用的数据将存储在SQLite数据库中,在通过MapInfo使用它之前需要准备该数据库。因此,我正在用 C# 编写一个 .NET 库来处理创建数据库和导入通过我开发的 MapBasic GUI 选择的 CSV 文件。
所以。。。
我有一个名为 Geo_Schema 的类来保存需要插入到数据库中的几何表的架构。在该类中,我有一个表类数组。每个表类中都有一个字段类数组。
public class Field
{
public string name;
public string type;
}
public class Table : IEnumerable
{
public string name;
public int numFields;
public Field[] fields = new Field[8];
public IEnumerator GetEnumerator()
{
return fields.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return fields.GetEnumerator();
}
}
public class Geo_Schema : IEnumerable
{
public Table[] table = new Table[3];
public IEnumerator GetEnumerator()
{
return table.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return table.GetEnumerator();
}
}
不确定这是否是构建此数据的好方法。我认为一定有更好的方法,所以我的第一个问题正是这样。有没有更好的方法来存储此表架构数据?我应该在这里使用继承吗?这个问题的答案实际上可能会解决下一点......
我继续在方法中使用上述类,但是在尝试为类属性赋值时出现错误。错误显示为"对象引用未设置为对象的实例"。
private static bool CheckMappable(SQLiteConnection conn, String tabName)
{
SQLiteCommand cmd = new SQLiteCommand();
Geo_Schema geo_schema = new Geo_Schema();
geo_schema.table[0].name = "spatial_ref_sys"; geo_schema.table[1].name = "geometry_columns";
geo_schema.table[0].numFields = 7; geo_schema.table[1].numFields = 7;
geo_schema.table[0].fields[0].name = "srid"; geo_schema.table[1].fields[0].name = "f_table_name";
geo_schema.table[0].fields[0].type = "INTEGER PRIMARY KEY"; geo_schema.table[1].fields[0].type = "TEXT";
geo_schema.table[0].fields[1].name = "sr_name"; geo_schema.table[1].fields[1].name = "f_geometry_column";
geo_schema.table[0].fields[1].type = "TEXT"; geo_schema.table[1].fields[1].type = "TEXT";
geo_schema.table[0].fields[2].name = "auth_name"; geo_schema.table[1].fields[2].name = "geometry_type";
geo_schema.table[0].fields[2].type = "TEXT"; geo_schema.table[1].fields[2].type = "INTEGER";
geo_schema.table[0].fields[3].name = "auth_srid"; geo_schema.table[1].fields[3].name = "geometry_dettype";
geo_schema.table[0].fields[3].type = "INTEGER"; geo_schema.table[1].fields[3].type = "INTEGER";
geo_schema.table[0].fields[4].name = "srtext"; geo_schema.table[1].fields[4].name = "coord_dimension";
geo_schema.table[0].fields[4].type = "TEXT"; geo_schema.table[1].fields[4].type = "INTEGER";
geo_schema.table[0].fields[5].name = "sr_xytol"; geo_schema.table[1].fields[5].name = "srid";
geo_schema.table[0].fields[5].type = "REAL"; geo_schema.table[1].fields[5].type = "INTEGER";
geo_schema.table[0].fields[6].name = "sr_ztol"; geo_schema.table[1].fields[6].name = "geometry_format";
geo_schema.table[0].fields[6].type = "REAL"; geo_schema.table[1].fields[6].type = "TEXT";
我不理解这个错误,因为我创建了一个geo_schema实例,据我所知,它在其构造函数中创建一个新的 Table 类数组,然后 Table 构造函数对字段数组执行相同的操作。谁能帮我了解这里发生了什么?我对 .NET 和 C# 比较陌生,所以如果这看起来微不足道,请道歉!
谢谢!
在其构造函数中创建一个新的表类数组
到目前为止
然后 Table 构造函数执行相同的操作
但永远不会调用表的构造函数。
您需要初始化表:
SQLiteCommand cmd = new SQLiteCommand();
Geo_Schema geo_schema = new Geo_Schema();
// here it is
geo_schema.table[0] = new Table(whatEverYouNeedHere);
geo_schema.table[0].name = "spatial_ref_sys"; geo_schema.table[1].name = "geometry_columns";
geo_schema.table[0].numFields = 7; geo_schema.table[1].numFields = 7;
// the same with the other two tables within your array