我正在构建一个自定义数据结构来保存TreeView,以便我可以将其序列化。这一点是无关紧要的,是背景,但我把它放在这里。
我有一个CustomNode类,树视图将保存在List<CustomNode>
中:
private class CustomNode
{
public CustomNode()
{}
public CustomNode (string name)
{
NodeName = name;
}
public string NodeName { get; set; }
public int Level { get; set; }
public int Index { get; set; }
public CustomNode parent;
public List<CustomNode> children;
}
这是我试图解决的相关问题。在我的代码中的某一点,我想找到特定CustomNode的父级,所以我这样做:
CustomNode customNode = new CustomNode();
//initialise properties of customNode (below)
.
.
.
CustomNode customNodeParent = new CustomNode();
customNodeParent = listOfCustomNodes.Find(_customNode => (_customNode.Index == node.Index && _customNode.Level == node.Level));
customNode.Index = customNodeParent.children.Count;
最后一行抛出对象引用未设置为对象的实例。异常。我不明白为什么会这样。
编辑:还有另一个问题。在我打电话的地方:
customNode.Index = customNodeParent.children.Count;
customNodeParent为null。我看到发生了什么。它找不到节点。需要解决这个问题。
答案 0 :(得分:4)
在CustomNode
的声明中,更改
public List<CustomNode> children;
到
public List<CustomNode> children = new List<CustomNode>();
使用您当前的代码,您说“CustomNode
有一个名为children
的字段,其类型为List<CustomNode>
”,但此字段的值永远不会设置,所以当创建CustomNode
时,children
为null
。
通过进行上述更改,您说“首次创建时,CustomNode
的{{1}}是实际对象,新children
”。由于这是一个实际的对象,而不是List<CustomNode>
,因此可以安全地询问它null
。
答案 1 :(得分:0)
因为customNodeParent.children
为空。
在尝试使用之前,您需要实例化customNodeParent.children
。
最简单地完成声明,然后可能在构造函数中,作为最后的手段,在类外的实例化代码中。