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

时间:2011-11-15 06:27:21

标签: c# syntax null

  

可能重复:
  Deep Null checking, is there a better way?

例如,如果您在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; 

有没有更优雅或更方便的方法呢?

3 个答案:

答案 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个参数)。这对我来说真的很好用!