【问题标题】:Detecting statically whether a linq expression is null静态检测 linq 表达式是否为空
【发布时间】:2017-10-18 20:01:59
【问题描述】:

我的问题是我想检查任何给定的 Linq 表达式,说它是否是一个 表达式 等于表达式常量 n​​ull(即 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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多