Я придумал этот метод расширения.Требуется указать свойство для доступа в виде лямбды и значение по умолчанию, которое будет использоваться, если фактическое значение или что-либо в цепочке равно нулю:
public static TOut ValueOrDefault<TIn, TOut>(this TIn input, Func<TIn, TOut> projection, TOut defaultValue)
where TOut : class
{
try
{
return projection(input) ?? defaultValue;
}
catch (NullReferenceException)
{
return defaultValue;
}
catch (InvalidOperationException)
{
return defaultValue;
}
}
Использование:
var value = topObject.ValueOrDefault(x=>x.ChildObject.AnotherChild.ChildProperty, String.Empty);
value
будет пустой строкой, если topObject, ChildObject, AnotherChild или ChildProperty равны нулю.Если все они являются допустимыми ссылками, возвращаемое значение будет таким, каким на самом деле является ChildProperty (которое может быть пустой строкой).Уловка для исключения NullReferenceException обрабатывает ссылки дочерних элементов пустой ссылки.Для обнуляемых типов InvalidOperationException выбрасывается при доступе к свойству Value пустого обнуляемого типа.