【发布时间】:2017-10-18 20:01:59
【问题描述】:
我的问题是我想检查任何给定的 Linq 表达式,说它是否是一个 表达式 等于表达式常量 null(即 Expression.Constant(null)),无需编译。但是,我不想做的是比较表达式的 value 是否为空。这是一个纯粹的语法检查。例如,这个表达式不起作用:
Expression.Equal(Expression.Constant(null), a) 用于表达式 a
自从
Expression.Equal(Expression.Constant(null),
Expression.Conditional(
Expression.Constant(false),
Expression.Convert(Expression.Constant(3), typeof(object)),
Expression.Constant(null)))
会评估为真,这不是我想要的。
我想用a.IsNullExpr 之类的东西来做这件事。然而,这样做的天真的解决方案
public static bool IsNullExpr(Expressions a) { return a == Expression.Constant(null); }
似乎不起作用,大概是因为 linq 表达式的相等运算符是根据对象地址(或类似的东西)完成的(我认为,至少 Expression.Constant(null) == Expression.Constant(null) 评估为假)。
有没有一种非常简单的方法可以解决我忽略的这个问题?
【问题讨论】:
-
至关重要的是,我不想在 linq 中使用类似这样的东西:,为什么?
-
不编译 但是如果你想返回
bool,则必须计算表达式。我认为您想要的是将表达式转换为返回布尔值(也称为谓词)的表达式。 -
两个原因:如果我们有一个 String 类型的 linqExpression,但计算结果为 null(可能通过方法调用)但它不是常量,那么作为表达式与表达式不同有一个常量空值。我想要一个解决方案来排除这种情况。 (我需要表达式本身是一个常量 null,而不是任何计算结果为 null 的旧表达式)。一个类比可能是 (3+4) 和 7 评估为相同的值,但是是不同的表达式。原因二是表达式 a 可能非常慢,我不想运行它。
-
(string)null或(string)(object)null形式的表达式呢?两者都是空常量,但常量隐藏在Convert表达式中。Expression.Default(typeof(string))呢?这实际上是一个空常量,但它不是ConstantExpression。你想检测这些情况吗? -
@MikeStrobel 就我而言,我不会将转换表达式视为空常量(我的问题是在类型化表达式中处理未转换的空值(不同的表达式库,而不是 linq)!我天真地认为我使用的程序会插入转换!)
标签: c# linq expression-trees