Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态检测linq表达式是否为空_C#_Linq_Expression Trees - Fatal编程技术网

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

C# 静态检测linq表达式是否为空,c#,linq,expression-trees,C#,Linq,Expression Trees,我的问题是,我想检查任何给定的Linq表达式,比如它是否作为表达式等于表达式常量null(即Expression.constant(null)),而不编译它。但是,我不想做的是比较表达式的值是否为null。这是一个纯粹的语法检查。例如,此表达式不起作用: Expression.Equal(Expression.Constant(null),a)用于表达式a 自 Expression.Equal(Expression.Constant(null), Expression.C

我的问题是,我想检查任何给定的Linq表达式,比如它是否作为表达式等于表达式常量null(即Expression.constant(null)),而不编译它。但是,我不想做的是比较表达式的值是否为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)
的计算结果为false)


有没有一种非常简单的方法可以解决我忽略的问题?

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

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

关键的是,我不想在linq中这样做,比如:,为什么?不编译它,但是如果要返回
bool
,则必须对表达式求值。我认为您需要的是将表达式转换为返回布尔值(也称为谓词)的表达式。原因有二:如果我们有一个linqExpression,它是字符串类型,但计算结果为null(可能通过方法调用),但它不是常量,那么作为一个表达式,它不同于具有常量null的表达式。我想要一个解决方案,排除这种可能性。(我需要表达式本身是一个常量null,而不是任何计算值为null的旧表达式)。(3+4)和7的计算结果可能是相同的,但它们是不同的表达式。原因二是表达式a可能非常慢,我不想运行它。那么
(string)null
(string)(object)null
形式的表达式呢?两者都是空常量,但这些常量隐藏在
Convert
表达式中。Expression.Default(typeof(string))呢?这实际上是一个空常量,但它不是一个
ConstantExpression
。你想检测这些情况吗?@ MikestRabel.对于我的情况,我不认为转换表达式是空常量(我的问题是处理类型化表达式中的非转换空值(不同的表达式库,而不是LINQ)!我天真地认为我正在使用的程序会插入转换!)