У меня была та же проблема, я написал несколько небольших методов расширения:
public static TResult WhenNotNull<T, TResult>(
this T subject,
Func<T, TResult> expression)
where T : class
{
if (subject == null) return default(TResult);
return expression(subject);
}
public static TResult WhenNotNull<T, TResult>(
this T subject, Func<T, TResult> expression,
TResult defaultValue)
where T : class
{
if (subject == null) return defaultValue;
return expression(subject);
}
public static void WhenNotNull<T>(this T subject, Action<T> expression)
where T : class
{
if (subject != null)
{
expression(subject);
}
}
Вы используете это так;
string str = null;
return str.WhenNotNull(x => x.Length);
или
IEnumerable<object> list;
return list.FirstOrDefault().WhenNotNull(x => x.id, -1);
или
object obj;
IOptionalStuff optional = obj as IOptionalStuff;
optional.WhenNotNull(x => x.Do());
Существуют также перегрузки для обнуляемых типов.