War*_*uck 8 c# null extension-methods linq-to-xml
是否有更好/更短的方式来处理(大量)空引用,例如当我使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
PS:我知道我可以在这个例子中使用XPath,但在更复杂的情况下并非总是如此.
整体方法是合理的 - 虽然我不确定Func<T,T>哪个似乎有点限制.如果你限制返回相同的东西,我想知道是否只接受name(string)作为第二个arg会不会更容易?
重新命名 - 也许借用LINQ?这是essentaially a 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);
}
Run Code Online (Sandbox Code Playgroud)
(编辑)可能与附加XElement具体:
public static XElement SelectOrDefault(
this XElement element, XName name)
{
return element == null ? null : element.Element(name);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1541 次 |
| 最近记录: |