如何获得房产的价值?

时间:2016-04-20 19:10:44

标签: c# linq expression-trees

我有一个派生自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 个答案:

答案 0 :(得分:2)

要获取值,您需要Member所有者(Expression属性 - 字段或属性的包含对象)为{{1} (对于静态属性/字段),ConstantExpression或其他null(还有其他方案,但在这里我们谈论简单的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;
}