繁体   English   中英

如何获得财产的价值?

[英]How to get value of a property?

我有一个从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;
    }
}

但是我如何获得财产价值?

为了获取值,您需要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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM