Элегантный способ справиться с нулевыми ссылками в цепочечных методах оси XElement - PullRequest
6 голосов
/ 20 июня 2011

Учитывая что-то вроде этого:

var results = theElement.Element("Blah").Element("Whatever").Elements("Something");

Есть ли элегантный способ справиться с нулевым бла или каким-то другим элементом, поэтому результаты в этих случаях просто нулевые или пустые?

Я знаюЯ могу разделить запрос и вручную выполнить эти проверки, но мне было интересно, есть ли что-то более лаконичное.

1 Ответ

6 голосов
/ 20 июня 2011

Вы можете добавить несколько методов расширения, чтобы сделать это для вас. Для метода 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);
    }
}

Вы можете использовать их следующим образом:

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

Если вы не запрашиваете ElementsOrEmpty, а ваш последний запрос - ElementOrDefault, вы должны проверить нулевое значение вместо использования метода Enumerable.Any.

...