静态检测 linq 表达式是否为空
Detecting statically whether a linq expression is null
我的问题是我想检查任何给定的 Linq 表达式,说它是否作为一个 表达式 等于表达式常量 null(即 Expression.Constant( null)), 无需编译。但是,我不想做的是比较表达式的 value 是否为 null。这是一个纯粹的语法检查。例如,这个表达式将不起作用:
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)
计算结果为假)。
有没有一种非常简单的方法可以解决我忽略的这个问题?
如果我没理解错的话,你可以这样做:
Expression exp = Expression.Constant(null);
bool isNull = exp is ConstantExpression && ((ConstantExpression)exp).Value == null;
我的问题是我想检查任何给定的 Linq 表达式,说它是否作为一个 表达式 等于表达式常量 null(即 Expression.Constant( null)), 无需编译。但是,我不想做的是比较表达式的 value 是否为 null。这是一个纯粹的语法检查。例如,这个表达式将不起作用:
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)
计算结果为假)。
有没有一种非常简单的方法可以解决我忽略的这个问题?
如果我没理解错的话,你可以这样做:
Expression exp = Expression.Constant(null);
bool isNull = exp is ConstantExpression && ((ConstantExpression)exp).Value == null;