检查MemberBinding的Expression是否已设置或为null

时间:2017-01-30 16:32:46

标签: c# expression expression-trees equality

我有List<MemberBindings>我检查特定属性。 根据属性,我想检查表达式并决定是保留还是丢弃绑定。

目前我有以下内容:

foreach(var memberBinding in memberBindings)
{
    // ... check for attributes
    var theExpression = ((MemberAssignment)memberBinding).Expression;
    // ... check if not set and skip
}

我想检查表达式是否为空(意思是未设置),但我不明白这一点。 在DebugView中,它为{null}的{​​{1}} - 属性显示Expression

memberBindingtheExpression == null都没有返回theExpression.Equals(null)。同样尝试了true,结果相同。

我在这里缺少什么?

**更新(添加了debug-view的截图)**

enter image description here

1 个答案:

答案 0 :(得分:1)

Expression表达式的MemberAssignment属性永远不会null。如果它表示空值分配,则其类型为ConstantExpressionValue属性为null

但是,Expression类不会覆盖==运算符和Equals方法,因此将引用进行比较,这就是原因

theExpression == Expression.Constant(null)

theExpression.Equals(Expression.Constant(null))

不起作用(Expression.Constant返回一个新的表达式引用)。

相反,您需要检查表达式实例是否为ConstantExpression类型(通过使用NodeType属性或is运算符),如果是,则转换它并检查{{ 1}}属性。

像:

Value

if (theExpression.NodeType == ExpressionType.Constant &&
    ((ConstantExpression)theExpression).Value == null)

if (theExpression is ConstantExpression && ((ConstantExpression)theExpression).Value == null) 运营商:

as