我有几个由API返回的普通旧C#对象,并且在其中嵌套了几层POCO。我需要访问这些结构中包含的字段,但是因为当数据丢失时,API将这些嵌套对象保留为null,所以我发现自己必须进行大量的空检查才能进入我真正想要的字段。
if(obj != null && obj.Inner != null && obj.Inner.Innerer != null) { ... }
我提出的最短形式是使用三元运算符。
obj != null && obj.Inner != null && obj.Inner.Innerer != null ? obj.Inner.Innerer.Field : null;
C#有没有办法做到这一点而不必写出所有这些比较?我真的很喜欢简短的东西:
obj.Inner.Innerer.Field ?? null;
但是只检查Field为null。
答案 0 :(得分:1)
请看一下这个非常聪明和优雅的解决方案:
http://www.codeproject.com/Articles/109026/Chained-null-checks-and-the-Maybe-monad
答案 1 :(得分:0)
它并不漂亮,但您可以在代码中编写访问器函数来封装null
检查,因此您只需在一个地方执行此操作。
E.g。
Innerer GetInnerer()
{
if(obj != null && obj.Inner != null && obj.Inner.Innerer != null)
{
return obj.Inner.Innerer;
}
return null;
}
这样你就可以这样称呼它:if (myObject.GetInnerer() != null)...
。你必须创建许多这些函数,但至少它会将null检查的'goreyness'移动到一个位置。