Извините за некромантию, но у меня возникла такая же проблема, и я решил ее с помощью лямбда-операции. Это не самый красивый, но он сохраняет мой код лаконичным.
Обидно, что C # не поддерживает статический импорт или импорт отдельных функций, но в любом случае:
Определите эту функцию где-нибудь:
private static TResult N<TParent,TResult>(TParent parent, Func<TParent,TResult> operation) {
if( parent == null ) return default(TResult);
return operation( parent );
}
Затем, чтобы использовать его в вашем примере:
String endString = N(startString, s => s.Trim());
Функция N
возвращает null
, если первый аргумент равен нулю, в противном случае она оценивает указанную лямбда-функцию со значением в качестве аргумента.
Вы можете вложить это, конечно, так. Например, для безопасного разыменования длинной цепочки, например
String someValue = someObject.SomeProperty.SomeOtherProperty.SomeMethod().SomeFinalProperty;
если какое-либо из этих свойств или методов возвращает ноль, вам нужно везде вставлять нулевые проверки, или вы можете сделать это:
String someValue = N(N(N(N(someObject, o => o.SomeProperty), o => o.SomeOtherProperty), o => o.SomeMethod()), o => o.SomeFinalProperty);
Как я уже сказал, это не самая красивая :) 1021 *
Вы можете упростить это, сделав N
методом расширения System.Object
, например так:
String someValue = someObject.N( o => o.SomeProperty ).N( o => o.SomeOtherProperty ).N( o => o.SomeMethod() ).N( o => o.SomeFinalProperty );
... что я считаю намного аккуратнее.