C#表达式检查成员/属性是否为空

时间:2019-07-19 15:52:31

标签: c#

我们正在比较复杂的对象,并根据表达式生成数据。

我们将表达式传递给方法并在其中执行一些逻辑。

在此代码中,我们编译表达式以获取其值,但是有时这些表达式会引发空引用异常,因为对象可以为空。我们通过捕获异常来编写了一个快速修复程序,但这会大大降低应用程序的速度,而且不是一个干净的解决方案。

现在,我真正想做的是检查每个成员是否为null,或者在运行编译时整个表达式不会引发null引用异常。

这就是我们调用方法的方式,“用户名”或“地址”可能为空。

Compare( () => someObjectA.User.Address.City, () => someObjectB.User.Address.City);

在compare方法中,我们尝试获取每个对象的值并进行比较。

void Compare<TField>( Expression<TField> left, Expression<TField> right) {

object lValue;
object rValue;

try{
lValue = left.Compile().Invoke();
} catch{
lValue = default;
}


try{
rValue = right.Compile().Invoke();
} catch{
rValue = default;
}

}

我想删除这些尝试捕获并使用表达式进行一些空检查。

我尝试了一些方法,但无法使其正常工作。我希望有人能指出我的正确方向吗?

在此先感谢您的宝贵时间!

1 个答案:

答案 0 :(得分:-1)

您可以只使用null运算符?,如果对象为null,则将使用双问号??之后的值。

Compare( () => someObjectA?.User?.Address?.City ?? [somevalue],
         () => someObjectB?.User?.Address?.City ?? [somevalue]);