静态检测linq表达式是否为空

时间:2017-10-18 10:51:33

标签: c# linq expression-trees

我的问题是我要检查任何给定的Linq表达式,说明它是否为表达式等于表达式constant null(即Expression.Constant(null)),没有编译它。但是,我不想做的是比较表达式的是否为空。这是一个纯粹的语法检查。例如,此表达式不起作用:

Expression.Equal(Expression.Constant(null), a)表达式

Expression.Equal(Expression.Constant(null), 
           Expression.Conditional(
                  Expression.Constant(false),
                  Expression.Convert(Expression.Constant(3), typeof(object)),
                  Expression.Constant(null)))

将评估为true,这不是我正在寻找的。

我想用a.IsNullExpr之类的东西做理想的事情。然而,做到的天真的解决方案

public static bool IsNullExpr(Expressions a) { return a == Expression.Constant(null); }

似乎不起作用,大概是因为linq表达式的相等运算符是基于对象地址(或类似的东西)完成的(我认为,至少Expression.Constant(null) == Expression.Constant(null)评估为假。)

是否有一种解决这个问题的简单方法我忽略了?

1 个答案:

答案 0 :(得分:3)

如果我理解正确,你可以这样做:

Expression exp = Expression.Constant(null);
bool isNull = exp is ConstantExpression && ((ConstantExpression)exp).Value == null;