处理链式XElement轴方法中的空引用的优雅方法

Man*_*inz 6 .net xelement linq-to-xml method-chaining

鉴于这样的事情:

var results = theElement.Element("Blah").Element("Whatever").Elements("Something");
Run Code Online (Sandbox Code Playgroud)

是否有一种优雅的方法来处理null Blah或Whatever元素,因此在这些情况下结果只是null或空?

我知道我可以拆分查询并手动进行这些检查但是想知道是否有更简洁的东西.

Ahm*_*eed 6

您可以添加一些扩展方法来为您执行此操作.对于该Element方法,您将返回null或元素本身.对于该Elements方法,您将返回空结果或目标元素.

这些是扩展方法:

public static class XElementExtensions
{
    public static XElement ElementOrDefault(this XElement element, XName name)
    {
        if (element == null)
            return null;

        return element.Element(name);
    }

    public static IEnumerable<XElement> ElementsOrEmpty(this XElement element, XName name)
    {
        if (element == null)
            return Enumerable.Empty<XElement>();

        return element.Elements(name);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以这种方式使用它们:

var query = theElement.ElementOrDefault("Blah")
                      .ElementOrDefault("Whatever")
                      .ElementsOrEmpty("Something");
if (query.Any())
    // do something
else
    // no elements
Run Code Online (Sandbox Code Playgroud)

如果您没有查询ElementsOrEmpty并且您的上一个请求是为了ElementOrDefault您将检查null而不是使用该Enumerable.Any方法.