使用Nunit通过以下代码块测试C#代码:

foreach (XmlNode node in nodeList)
{
    thisReport.Id = node.Attributes.GetNamedItem("id").Value;
    thisReport.Name = node.Attributes.GetNamedItem("name").Value;
    thisReport.Desc = node.Attributes.GetNamedItem("desc").Value;
    if (node.SelectNodes("subreport").Count > 0)
    {
        thisReport.HasSubReport = true;
        subReportNodeList = node.SelectNodes("subreport");
        foreach(XmlNode subNode in subReportNodeList)
        {
            mySubReport.ParentID = node.Attributes.GetNamedItem("id").Value;
            mySubReport.Priority = subNode.Attributes.GetNamedItem("priority").Value;
            mySubReport.SubReportId = subNode.Attributes.GetNamedItem("id").Value;
            mySubReport.SubReportName = subNode.Attributes.GetNamedItem("name").Value;
            string sTime = subNode.Attributes.GetNamedItem("time").Value;
            mySubReport.Time = Convert.ToInt16(sTime);
            thisReport.SubReportsList.Add(mySubReport);
        }
    }
    else
    {
        thisReport.HasSubReport = false;
    }
    reports.Add(thisReport);
}


该代码失败,并在该行上添加了空对象引用:

            thisReport.SubreportsList.Add(mySubReport)


但是查看本地人,thisReport存在,并且在块的顶部分配了值,而mySubReport存在,并且在分配给thisReport的行的上方分配了值。 mySubReport中的所有值都是有效的,并且SubReportsList中的thisReport是类型为SubReport的通用列表。

那么,零值在哪里?看起来很简单,一定是我看不到的非常明显的东西。

最佳答案

您尚未在调用Add之前实例化SubReportsList。在添加mySubReport之前,请执行以下操作:

thisReport.SubReportsList = new List<SubReport>();
thisReport.SubReportsList.Add(mySubReport);


您还可以更改SubReportsList属性以使您的生活更轻松:

public class Report
{
    public IList<SubReport> SubReportsList
    {
        get
        {
            if (_subReportsList == null)
            {
                _subReportsList = new List<SubReport>();
            }
            return _subReportsList;
        }
    }
    private IList<SubReport> _subReportsList;
}


这样做将实例化您的List(如果在null时调用它)。

关于c# - 空对象引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3727939/

10-13 07:50