2009-03-10 14 views
8

¿Existe una manera mejor/más corta para manejar (muchas) referencias nulas, por ejemplo, cuando estoy usando LinqToXML.Manejo de referencias nulas cuando se utiliza, por ejemplo, Linq-To-Xml

Escribí esta extensión para XElement que lo maneja muy bien, ¿pero tal vez hay otra manera?

¿Y el nombre de la función? "Y" no es realmente descriptivo.

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(); 
    } 
} 

PD: Sé que podría usar XPath para este ejemplo, pero no siempre es el caso en casos más complejos.

Respuesta

5

El enfoque general es razonable, aunque no estoy seguro del Func<T,T> que parece un poco restrictivo. Si se limita a devolver lo mismo, me pregunto si aceptar el nombre (string) como segundo argumento no sería más fácil.

Re naming - ¿quizás pedir prestado de LINQ? Esta es essentaially un Select - ¿qué tal 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); 
} 

(editar) tal vez con el adicional de XElement específica:

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

me gusta el primer ejemplo, a pesar de que sólo podía editar el código para "donde T : clase "y tienen casi el mismo resultado. ¡Pero la posibilidad de devolver otros tipos es un buen extra! –

Cuestiones relacionadas