2017-01-30 120 views
0

我有一個List<MemberBindings>我檢查特定屬性。 根據屬性,我想檢查表達式並判斷是保留還是丟棄綁定。檢查是否設置了MemberBinding的表達式或爲空

目前,我有以下幾點:

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

,我要檢查,如果theExpression爲空(意味着未設置),但我不明白這一點。 在DebugView中,它顯示{null}的- memberBinding的屬性。

theExpression == null也不theExpression.Equals(null)返回true。也試過theExpression == Expression.Constant(null)/theExpression.Equals(Expression.Constant(null)),結果相同。

我在這裏錯過了什麼?

**更新(調試視圖的屏幕截圖加入)**

enter image description here

+0

什麼是在監視窗口中查看每個對象表達的價值觀?即將手錶添加到memberBindings中。另外你爲什麼要將該對象投射到MemberAssignment。這些是基類的子類型嗎? – Wheels73

+0

@ Wheels73更新我的問題,並添加了調試視圖的屏幕截圖,其中顯示了問題 – KingKerosin

回答

1

MemberAssignment表達的Expression屬性是從未null。當它代表空值賦值時,它將是ConstantExpression類型,其中Value屬性爲null

然而,Expression類沒有重載既不==運營商也不Equals方法,因此它相比,參考,這就是爲什麼

theExpression == Expression.Constant(null) 

theExpression.Equals(Expression.Constant(null)) 

不工作(Expression.Constant回報一個新的表達參考)。

相反,你需要檢查,如果表達式實例ConstantExpression型(通過使用NodeType財產或is運營商要麼),如果是,投它並檢查Value財產。

像:

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

if (theExpression is ConstantExpression && 
    ((ConstantExpression)theExpression).Value == null) 

as操作:

var constExpression = theExpression as ConstainExpression; 
if (constExpression != null && constExpression.Value == null) 
+0

中的MemberBinding的內容,或者對於C#7更好,如果(表達式是ConstantExpression ce && ce.Value == null) –