Общий подход разумен - хотя я не уверен насчет 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);
}