1

我正在尝试使用此结构将从 DataTable 中获得的几行添加到我的列表中:

protected struct roleProperties
{
    public string roleName { get; set; }
    public string[] functionTitle { get; set; }
}

如您所见,我想要方法字符串中的更多Title字符串

我一直在尝试这样做:

public void getRoleFuncs(int roleId)
{
    List<roleProperties> roles = new List<roleProperties>();
    int i = 1;

    SqlParameter ro_id = new SqlParameter("@ro_id", roleId);
    string q = "SELECT ro_name, fu_title FROM roles INNER JOIN rolefunctions ON roles.ro_id = rolefunctions.fk_role_id INNER JOIN functions ON rolefunctions.fk_func_id = functions.fu_id WHERE ro_id = @ro_id";
    SqlDataReader r = gm.returnReader(q, ro_id);
    while (r.Read())
    {
        roleProperties item = new roleProperties();
        item.roleName = r["ro_name"].ToString();
        foreach (IDataRecord str in r)
        {
            item.functionTitle[i] = r["fu_title"].ToString();
            i++;
        }
        roles.Add(item);
    }
}

但我在这一行得到一个空引用:

item.functionTitle[i] = r["fu_title"].ToString();

谁能看到我做错了什么?

4

3 回答 3

3

item.functionTitlenull因为数组是引用类型,并且您没有在任何地方初始化该属性(因此它具有默认值:null对于引用类型)。

即使这不是问题(假设functionTitle是一个空数组)item.functionTitle[i]也会再次抛出,因为它试图访问超出范围的索引。最后,您遇到了一个错误:数组中的第一个元素的索引是0,而不是1

您可以通过将代码更改为来解决上述所有问题

while (r.Read())
{
    roleProperties item = new roleProperties();
    item.roleName = r["ro_name"].ToString();
    item.functionTitle = r.Select(o => o["fu_title"].ToString()).ToArray();
    roles.Add(item);
}
于 2013-02-25T12:14:03.817 回答
1

先初始化数组。

item.functionTitle = new string[n]; // where n is an int
于 2013-02-25T12:14:12.093 回答
1

您的数组未初始化,因此为 null,因为您不知道您将需要的数组的大小,这似乎是一种更适合使用列表的方法

将您的结构更改为

protected class roleProperties
{
    public string roleName { get; set; }
    public IList<string> functionTitle { get; private set;}
    public roleProperties(){
        functionTitle = new List<string>();
    }
}

然后改变

item.functionTitle[i] = r["fu_title"].ToString();

item.functionTitle.Add(r["fu_title"].ToString());

我已将结构更改为类,因为它是可变的,而可变结构是邪恶的

于 2013-02-25T12:18:14.263 回答