是否有方便的语法来检查可以为null的嵌套属性?

可能重复:
Deep Null检查,有更好的方法吗?

例如,如果您在Foo1.Bar1.Foo2.Bar2上执行逻辑(并且每个属性都可以为null),那么您不能只对foo.Bar1.Foo2.Bar2执行此操作,因为您可能会得到null引用exception

目前这就是我的工作

if (foo1!=null && foo1.Bar1!=null && foo1.Bar1.Foo2 !=null && foo1.Bar1.Foo2.Bar2!=null) return DoStuff(foo1.Bar1.Foo2.Bar2); //actually a logic based on the value of Bar2 else return null; 

这样做有更优雅或方便的方式吗?

不,没有。

唯一可能DoStuff是评估是否在正确的类中实际定义了DoStuff

不,不幸的是没有。 我也经常希望语法更简单!

然而,这是我提出的一个相当不错的选择:创建一个Null-Safe-Chain辅助方法。 这是它的样子:

 var bar2 = NullSafe.Chain(foo1, f1=>f1.Bar1, b1=>b1.Foo2, f2=>f2.Bar2); 

这是方法:

 public static TResult Chain(TA a, Func b, Func c, Func r) where TA:class where TB:class where TC:class { if (a == null) return default(TResult); var B = b(a); if (B == null) return default(TResult); var C = c(B); if (C == null) return default(TResult); return r(C); } 

我还创建了一堆重载(有2到6个参数)。 这对我来说真的很好用!

这个扩展方法工作,但不是很酷的代码或可能是可以改善它:

 public static bool AnyNull(this TSource source, Func selector) { try { selector(source); return false; ; } catch { return true; } } 

用它:

 if(!foo1.AnyNull(p=>p.Bar1.Foo2.Bar2)) DoStuff(foo1.Bar1.Foo2.Bar2)