【问题标题】:C# Expression check if members/properties are null [duplicate]C#表达式检查成员/属性是否为空[重复]
【发布时间】: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#


【解决方案1】:

您可以只使用空运算符?,如果一个对象为空,它将遵循双问号??之后的值。

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

【讨论】:

  • 感谢您的回复,但是?。符号在这里不是一个选项。
  • 为什么不呢?如果您在问题中指定这一点会有所帮助吗?
  • 感谢您的反馈。那确实很有帮助。回答你的问题。在表达式树中,lambda 可能不包含空传播运算符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2018-11-08
  • 2015-02-16
  • 2019-08-31
相关资源
最近更新 更多