2017-01-30 10 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がnullであるかどうかを確認したい(設定されていないという意味)が、私はポイントを得ることはありません。 DebugViewにはmemberBindingExpressionプロパティの場合は{null}が表示されます。

どちらも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私の質問が更新され、問題のMemberBindingの内容を表示するデバッグビューのスクリーンショットが追加されました – KingKerosin

答えて

1

MemberAssignment表現のExpressionプロパティがnullことはありません。 のヌル値を表す場合は、タイプのとなり、タイプがValueとなります。

しかし、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

またはC#7の場合、 'if(theExpression is ConstraintExpression ce && ce.Value == null)' –

関連する問題