我们正在比较复杂的对象,并根据表达式生成数据。
我们将表达式传递给方法并在其中执行一些逻辑。
在此代码中,我们编译表达式以获取其值,但是有时这些表达式会引发空引用异常,因为对象可以为空。我们通过捕获异常来编写了一个快速修复程序,但这会大大降低应用程序的速度,而且不是一个干净的解决方案。
现在,我真正想做的是检查每个成员是否为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;
}
}
我想删除这些尝试捕获并使用表达式进行一些空检查。
我尝试了一些方法,但无法使其正常工作。我希望有人能指出我的正确方向吗?
在此先感谢您的宝贵时间!
答案 0 :(得分:-1)
您可以只使用null运算符?
,如果对象为null,则将使用双问号??
之后的值。
Compare( () => someObjectA?.User?.Address?.City ?? [somevalue],
() => someObjectB?.User?.Address?.City ?? [somevalue]);