【发布时间】:2019-07-20 00:04:01
【问题描述】:
我们正在比较复杂的对象并根据表达式生成数据。
我们将表达式传递给方法并在其中执行一些逻辑。
在这段代码中,我们编译表达式以获取它的值,但有时这些表达式会抛出空引用异常,因为对象可以为空。我们通过捕获异常编写了一个快速修复程序,但这会大大降低应用程序的速度,而且它不是一个干净的解决方案。
现在我真正想做的是检查每个成员是否为空,或者当我们运行编译时整个表达式不会抛出空引用异常。
这就是我们调用方法的方式,可能 User 或 Address 为 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;
}
}
我想删除这些尝试捕获并使用表达式进行一些空检查。
我尝试了一些方法,但无法使其正常工作。我希望有人能给我指出好的方向吗?
提前感谢您的宝贵时间!
【问题讨论】:
-
为什么要使用 lambdas 和表达式而不是简单地评估属性?
-
您是否考虑过使用空条件运算符?这很方便。 docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
-
怎么样?:运算符
-
我简化了这个例子,所以我明白为什么要使用它没有意义,但它用于通用比较方法。不能使用?。运算符。
-
@servy 感谢您提供该问题的链接!很好的帮助!
标签: c#