【问题标题】:Handling null references when using eg Linq-To-Xml使用例如 Linq-To-Xml 时处理空引用
【发布时间】:2009-03-10 13:00:41
【问题描述】:

是否有更好/更短的方法来处理(大量)空引用,例如当我使用 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,但在更复杂的情况下并非总是如此。

【问题讨论】:

    标签: c# null linq-to-xml extension-methods


    【解决方案1】:

    总体方法是合理的——虽然我不确定Func&lt;T,T&gt; 似乎有点限制。如果您限制返回相同的内容,我想知道是否仅接受名称 (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);
    }
    

    【讨论】:

    • 我喜欢第一个示例,尽管我可以将代码编辑为“where T : class”并获得几乎相同的结果。但是返回其他类型的能力是一个很好的附加功能!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多