Обработка нулевых ссылок при использовании, например, Linq-To-Xml - PullRequest
8 голосов
/ 10 марта 2009

Есть ли лучший / более короткий способ обработки (большого количества) нулевых ссылок, например, когда я использую LinqToXML.

Я написал это расширение для XElement, которое прекрасно с ним справляется, но, может быть, есть другой способ?

А как насчет имени функции? «И» не совсем описательно.

public static class XmlExtentions
{
    public static T And<T>(this T obj, Func<T, T> action) where T : XElement
    {
        return obj == null ? obj : action(obj);
    }
}

internal class Program
{
    private static void Main()
    {
        //create example xml element
        var x = 
          XElement.Parse("<root><find><name>my-name</name></find></root>");

        //old way
        var test1 = x.Element("find");
        if (test1 != null) test1 = test1.Element("name");
        Console.WriteLine(test1);

        //using the extentions method
        var test2 = x.Element("find").And(findme => findme.Element("name"));
        Console.WriteLine(test2);

        Console.ReadLine();
    }
}

PS: я знаю, что мог бы использовать XPath для этого примера, но это не всегда так в более сложных случаях.

1 Ответ

5 голосов
/ 10 марта 2009

Общий подход разумен - хотя я не уверен насчет Func<T,T>, который кажется немного ограничительным. Если вы ограничиваетесь возвратом того же самого, мне интересно, будет ли проще принять имя (string) в качестве второго аргумента?

Переименование - возможно, позаимствовать у LINQ? По сути это Select - как насчет SelectOrDefault:

public static TResult SelectOrDefault<TSource, TResult>(
    this TSource obj, Func<TSource, TResult> selector) where TSource : class
{
    return SelectOrDefault<TSource, TResult>(
        obj, selector, default(TResult));
}

public static TResult SelectOrDefault<TSource, TResult>(
    this TSource obj, Func<TSource, TResult> selector,
    TResult @default) where TSource : class
{
    return obj == null ? @default : selector(obj);
}

(редактировать) может быть с дополнительным XElement специфичным:

public static XElement SelectOrDefault(
    this XElement element, XName name)
{
    return element == null ? null : element.Element(name);
}
...