【问题标题】:Creating an instance of a class which contains an array of class objects创建包含类对象数组的类的实例
【发布时间】:2013-10-16 12:01:47
【问题描述】:

在深入探讨我的问题之前,我想我应该先介绍一下我在做什么的背景。

我正在使用 MapInfo 的脚本语言 MapBasic 进行基于 GIS 的开发项目。我正在使用的数据将存储在一个 SQLite 数据库中,在我通过 MapInfo 使用它之前需要准备该数据库。因此,我正在用 C# 编写一个 .NET 库来处理创建数据库和导入通过我开发的 MapBasic GUI 选择的 CSV 文件。

所以...

我有一个名为 Geo_Schema 的类来保存需要插入数据库的几何表的模式。在那个类中,我有一个 Table 类的数组。每个表类中都有一个字段类数组。

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# 比较陌生,所以如果这看起来微不足道,我深表歉意!

谢谢!

【问题讨论】:

  • 很好。有什么问题?
  • 我没有看到问题...
  • 你遇到什么问题???请解释...
  • 由于我没有看到任何问题,我建议使用通用的IEnumerable<T>
  • 抱歉,我在完成问题之前不小心发布了。

标签: c# .net arrays class instance


【解决方案1】:

在其构造函数中创建一个新的 Table 类数组

目前为止

然后 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-08
    • 2014-06-04
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2010-11-10
    • 2016-09-28
    相关资源
    最近更新 更多