2009-03-10 20 views
8

Có cách nào tốt hơn/ngắn hơn để xử lý (nhiều) tham chiếu null không, ví dụ khi tôi đang sử dụng LinqToXML.Xử lý tham chiếu null khi sử dụng ví dụ: Linq-To-Xml

Tôi đã viết phần mở rộng này cho XElement xử lý nó khá độc đáo, nhưng có thể có một cách khác?

Và còn tên hàm thì sao? "Và" không thực sự mô tả.

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: Tôi biết tôi có thể sử dụng XPath cho ví dụ này, nhưng không phải lúc nào cũng xảy ra trường hợp phức tạp hơn.

Trả lời

5

Cách tiếp cận tổng thể là hợp lý - mặc dù tôi không chắc chắn về Func<T,T> có vẻ hơi hạn chế. Nếu bạn đang hạn chế để trở về cùng một điều, tôi tự hỏi nếu chỉ chấp nhận tên (string) như arg thứ hai sẽ không được dễ dàng hơn?

Đặt tên lại - có thể mượn từ LINQ? Đây là essentaially một Select - làm thế nào về 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); 
} 

(chỉnh sửa) có thể với thêm các XElement cụ thể:

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

Tôi thích ví dụ đầu tiên, mặc dù tôi chỉ có thể chỉnh sửa mã của tôi để "nơi T : class "và có kết quả gần như giống nhau. Nhưng khả năng trả lại các loại khác là một sự bổ sung tốt đẹp! –

Các vấn đề liên quan