使用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/