例如这段代码:
private void LoadComments(Member member, XElement commentsXml)
{
member.Comments = (from comment in commentsXml.Descendants("comment")
select new Comment()
{
ID = comment.Element("id").Value,
Text = comment.Element("text").Value,
Date = comment.Element("date").Value,
Owner = comment.Element("user").Element("name").Value
}).ToList();
}
ReSharper警告我,comment.Element行可能存在NullReferenceException。确实如此,异常被解雇了。
有关如何避免这种情况的任何建议吗?如果它返回null,只返回一个空字符串,这可能吗?
答案 0 :(得分:2)
我更喜欢它的扩展类:
public static class XElementExtension
{
public static string GetValue(this XElement input)
{
if (input == null)
return null;
return input.Value as T;
}
public static XElement GetSubElement(this XElement element, string id)
{
if (element == null)
return null;
return element.Element(id);
}
}
并将其用作:
ID = comment.Element("id").GetValue()
或
Owner = comment.Element("user").GetSubElement("name").GetValue()
还有其他方式:
答案 1 :(得分:1)
我只能认为你需要检查每个元素引用:
private void LoadComments(Member member, XElement commentsXml)
{
member.Comments = (from comment in commentsXml.Descendants("comment")
select new Comment()
{
ID = (comment.Element("id")==null)?"":comment.Element("id").Value,
Text = (comment.Element("text")==null)?"":comment.Element("text").Value,
Date = (comment.Element("date")==null)?"":comment.Element("date").Value,
Owner = (comment.Element("user")==null)?"":comment.Element("user").Element("name").Value
}).ToList();
}
最后一点有点弱,因为有两个节点确实应该被检查但是嵌套看起来有点不愉快,但唯一的方法是确定。
编辑----
作为扩展方法:
public static class MyExtensions
{
public static string ValueSafe(this XElement target)
{
if (target==null)
{ return ""; }
else
{ return target.Value; }
}
}
然后,您可以将.Value
替换为.ValueSafe
,表示没有机会进行测试。
答案 2 :(得分:1)
一些扩展可能有所帮助:
public static class XElementExtensions
{
public static XElement GetElement(this XElement element, XName elementName)
{
if (element != null)
{
XElement child = element.Element(elementName);
if (child != null)
{
return child;
}
}
return null;
}
public static String GetElementValue(this XElement element, XName elementName)
{
if (element != null)
{
XElement child = element.Element(elementName);
if (child != null)
{
return child.Value;
}
}
return null;
}
}
private void LoadComments(Member member, XElement commentsXml)
{
member.Comments = (from comment in commentsXml.Descendants("comment")
select new Comment()
{
ID = comment.GetElementValue("id"),
Text = comment.GetElementValue("text"),
Date = comment.GetElementValue("date"),
Owner = comment.GetElement("user").GetElementValue("name")
}).ToList();
}
答案 3 :(得分:0)
有可能 - 您需要将每个comment.Element().Value
语句包装在函数中。
我喜欢使用:
public string UnNull(object v)
{
if (v == null) return "";
return v.ToString();
}
至于最后一行,你需要额外关注那里以确保comment.Element("user")
不是null
并处理该情况。