我有一个派生自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;
}
}
但我如何获得物业价值?
答案 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;
}