例如,如果您在Foo1.Bar1.Foo2.Bar2上执行逻辑(并且每个属性都可以为null),那么您不能只对foo.Bar1.Foo2.Bar2执行此操作,因为它是可能的你得到空引用异常
目前这就是我的工作
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;
有没有更优雅或更方便的方法呢?
答案 0 :(得分:0)
不,没有。
唯一可能有用的是评估是否在正确的类中实际定义了DoStuff
。
答案 1 :(得分:0)
这个
public static bool AnyNull<TSource, TResult>(this TSource source, Func<TSource, TResult> selector)
{
try
{
selector(source);
return false; ;
}
catch { return true; }
}
使用它:
if(!foo1.AnyNull(p=>p.Bar1.Foo2.Bar2))
DoStuff(foo1.Bar1.Foo2.Bar2)
答案 2 :(得分:0)
不,不幸的是没有。我也经常希望语法更简单!
然而,这是我提出的一个相当不错的选择:创建一个Null-Safe-Chain辅助方法。这是它的样子:
var bar2 = NullSafe.Chain(foo1, f1=>f1.Bar1, b1=>b1.Foo2, f2=>f2.Bar2);
以下是方法:
public static TResult Chain<TA,TB,TC,TResult>(TA a, Func<TA,TB> b, Func<TB,TC> c, Func<TC,TResult> 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个参数)。这对我来说真的很好用!