2017-01-30 17 views
0

У меня есть List<MemberBindings>, который я проверяю на наличие определенных атрибутов. В зависимости от атрибутов, я хочу проверить выражение и решить, следует ли сохранить или выбросить привязку.Проверьте, установлено ли выражение MemberBinding или значение null

В настоящее время у меня есть следующие:

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

, и я хочу, чтобы проверить, если theExpression равно нулю (то есть не установлен), но я не получаю точку. В DebugView он отображает {null} для Expression -property of memberBinding.

Ни theExpression == null, ни theExpression.Equals(null) возвращение true. Также попробовал theExpression == Expression.Constant(null)/theExpression.Equals(Expression.Constant(null)) с тем же результатом.

Что мне здесь не хватает?

** Обновление (добавлен скриншот отладки ракурса) **

enter image description here

+0

Какие значения выражения в каждом объекте, если смотреть в окне просмотра? т. е. добавить часы к элементам. Также почему вы бросаете объект в MemberAssignment. Являются ли они подтипом базового класса? – Wheels73

+0

@ Wheels73 Обновлен мой вопрос и добавлен снимок экрана с отладочным изображением, показывающим содержимое вопроса, связанного с этим элементом – KingKerosin

ответ

1

Expression свойство выражения MemberAssignment никогда не 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

Или даже лучше с C# 7, if (theExpression is ConstantExpression ce && ce.Value == null) ' –