XElement NullReferenceException

3
我有以下代码。
 XElement opCoOptOff = doc.Descendants(ns + "OpCoOptOff").FirstOrDefault();
 String opCo = opCoOptOff.Element(ns + "strOpCo").Value;

现在,如果我返回的元素为 null,由于 XElement 为空,我会得到 NullReferenceException。因此,我将其更改为以下内容。

String opCo = opCoOptOff.Element(ns + "strOpCo").Value;
 if(opCoOptOff != null)
        {
String opCo = opCoOptOff.Element(ns + "strOpCo").Value;

我希望有一种更加优雅的方式来处理这个问题,因为这种情况经常出现,我想避免每次出现问题时都进行此类检查。非常感谢您的帮助。


“不完全是,只是检查空值而已”是一个有效的回答吗?我认为我们工作中的重要部分就是检查空值… - Kobi
2个回答

2

你可以编写一个扩展方法并在任何地方使用它:

public static class XDocumentExtension
{
   public static string GetSubElementValue(this XElement element, string item)
   {
        if(element != null && element.Value != null)
        {
           if (element.Element(item) != null)
           {
              return element.Element(item).Value;
           }
        }
        return null;
   }

   public static XElement GetElement(this XElement element, string item)
   {
        if (element != null)
            return element.Element(item);

        return null;
   }

   public static XElement GetElement(this XDocument document, string item)
   {
        if (document != null)
           return document.Descendants("item").FirstOrDefault();
        return null;
   }
}

将其用作:

String opCo = opCoOptOff.Element(ns + "strOpCo").GetSubElementValue(ns + "strOpCo");

此外,您可以添加其他扩展以达到您的目的。

编辑:我已更新答案,但如果您在我之前仔细阅读了它,您可以添加其他扩展以达到您的目的。我之所以这样写,是因为我猜想您可能想要调用空对象 Element,我不知道您的确切情况,但我添加了一些代码以进行更多澄清。根据您的情况完成 XDocumentExtension 类,并注意扩展方法可以在空对象上运行。


谢谢,但我觉得这个答案只适用于元素有效的情况。当opCoOptOff为空时,我仍然会收到一个nullreferenceexception。 - Ken
非常感谢。我意识到我忘记了额外的代码,试图对一个空对象进行操作。我想我应该能够从这里解决问题。非常感谢您的帮助。 - Ken
@Ken,关于扩展方法的一个重要事项是它们可以在空对象上工作(我之前说过),我建议您在验证中使用它以避免不必要的异常。 - Saeed Amiri

1

这是同样的问题,opCoOptOff仍将为空,抛出NRE - jb.
是的,我的用法略有不同,我使用Descendants(...).FirstOrDefault在一行中访问元素,然后直接将其转换为字符串。这样就可以工作了。 - mark w

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接