[英]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.