2016-04-20 2 views
1

У меня есть класс, производный от ExpressionVistor, и я пытаюсь разобрать выражение, как:Как получить стоимость недвижимости?

x => x.MyProperty != otherClass.OtherProperty; 

Я переопределяя VisitMember:

protected override Expression VisitMember(MemberExpression m) 
{ 
    if (m.Expression != null && m.Expression.NodeType == ExpressionType.MemberAccess) 
    { 
     var info = m.Member; 

     return m; 
    } 
} 

Но как я получаю свойство стоимость?

ответ

1

Для того, чтобы получить значение, вам нужно Member владельца (Expression свойство - вмещающего объект поля или свойства) быть либо null (для статического свойства/поля), ConstantExpression или другой MemberAcccessExpression (есть также другие сценарии, но здесь мы говорим о простых objA.propA.propB.propC аксессуарах). Это приводит к рекурсивной вспомогательный метод как это:

static bool TryGetValue(MemberExpression me, out object value) 
{ 
    object source = null; 
    if (me.Expression != null) 
    { 
     if (me.Expression.NodeType == ExpressionType.Constant) 
      source = ((ConstantExpression)me.Expression).Value; 
     else if (me.Expression.NodeType != ExpressionType.MemberAccess 
      || !TryGetValue((MemberExpression)me.Expression, out source)) 
     { 
      value = null; 
      return false; 
     } 
    } 
    if (me.Member is PropertyInfo) 
     value = ((PropertyInfo)me.Member).GetValue(source); 
    else 
     value = ((FieldInfo)me.Member).GetValue(source); 
    return true; 
} 

так что вы можете использовать его как это:

protected override Expression VisitMember(MemberExpression m) 
{ 
    object value; 
    if (TryGetValue(m, out value)) 
    { 
     // Use the value 
    } 

    return m; 
} 
+0

Но '' NodeType' является MemberAccess'. –

+0

@ Ivan-MarkDebono Извините, это было упрощено, посмотрите, работает ли обновление для вас. –