7

我有几个由 API 返回的普通旧 C# 对象,并且在其中嵌套了几层 POCO。我需要访问包含在这些结构深处的字段,但是因为当数据丢失时 API 将这些嵌套对象保留为空,我发现自己必须进行大量空检查才能获得我真正想要的字段。

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 是否为空。

4

2 回答 2

1

请看看这个非常聪明和优雅的解决方案:

http://www.codeproject.com/Articles/109026/Chained-null-checks-and-the-Maybe-monad

于 2013-07-26T18:43:20.990 回答
0

这并不漂亮,但是您可以在代码中编写访问器函数来封装null检查,因此您只需在一个地方执行此操作。例如

Innerer GetInnerer()
{
  if(obj != null && obj.Inner != null && obj.Inner.Innerer != null)
  {
    return obj.Inner.Innerer;
  }

  return null;
}

这样你就可以这样称呼它:if (myObject.GetInnerer() != null).... 您将不得不创建许多这样的函数,但至少它将空值检查的“血腥”移动到一个位置。

于 2013-07-26T20:05:12.540 回答