空对象引用

EoR*_*013 2 c# testing null nunit

使用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);
}
Run Code Online (Sandbox Code Playgroud)

代码失败,并在行上使用空对象引用:

            thisReport.SubreportsList.Add(mySubReport)
Run Code Online (Sandbox Code Playgroud)

但是查看本地,thisReport存在并且在块的顶部分配了值,并且mySubReport存在并且将值分配在它添加到thisReport的行的正上方.在所有值mySubReport都有效,并且SubReportsListthisReport是类型的泛型列表SubReport.

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

djd*_*d87 5

在调用之前,您没有实例化SubReportsList Add.在添加之前执行以下操作mySubReport:

thisReport.SubReportsList = new List<SubReport>();
thisReport.SubReportsList.Add(mySubReport);
Run Code Online (Sandbox Code Playgroud)

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

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

执行此操作将实例化List,如果它在null时被调用.