嵌套对象中的空值检查

7

我有一些由API返回的普通C#对象,其中包含几层嵌套的POCOs。我需要访问这些结构中深处包含的字段,但是因为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是否为null。

这个怎么样?(https://dev59.com/GHTYa4cB1Zd3GeqPvHpx#17663536) - rene
一个想法是,你可以尝试直接访问Inner.Innerer.Field,同时捕获空异常。如果沿途任何地方为空,异常会被捕获并返回null。否则,返回该值。 - KappaG3
不,异常在任何现代计算机上都不会是“性能惩罚”。它是用于“异常行为”,你不会对异常进行成千上万次的循环。 - Pierre-Luc Pineault
1
@KappaG3 只有当 getter 是返回这样的后备字段时才可能实现,但是在野外有很多实现在 get 方法中执行大量工作。 - rene
是的,这是一个我无法控制的API。而且这个问题出现是因为我正在为它编写包装器。 - Syon
显示剩余5条评论
2个回答

1

有趣的是,为了使这种链接起作用,我需要修改从API返回的对象,但我无法控制它们。 - Syon

0

这并不美观,但您可以在代码中编写访问器函数来封装null检查,以便您只需在一个地方执行它。

例如:

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

  return null;
}

这样你就可以像这样调用它:if (myObject.GetInnerer() != null)...。你需要创建一些这样的函数,但至少它会将空值检查的“丑陋”移到一个单一的位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接