I am parsing an Expression Tree. Given a NodeType of ExpressionType.MemberAccess, how do I get the value of that Field?
From C# MSDN docs: MemberAccess is A node that represents reading from a field or property.
A code snippet would be incredibly, incredibly helpful. Thanks in advance!!!
My code looks something like this:
public static List<T> Filter(Expression<Func<T, bool>> filterExp)
{
//the expression is indeed a binary expression in this case
BinaryExpression expBody = filterExp.Body as BinaryExpression;
if (expBody.Left.NodeType == ExpressionType.MemberAccess)
//do something with ((MemberExpressionexpBody.Left).Name
//right hand side is indeed member access. in fact, the value comes from //aspdroplist.selectedvalue
if (expBody.Right.NodeType == ExpressionType.MemberAccess)
{
//how do i get the value of aspdroplist.selected value?? note: it's non-static
}
//return a list
}
[updated for clarity]
First; cast the
Expression
to aMemberExpression
.A
MemberExpression
has two things of interest:PropertyInfo
/FieldInfo
to the memberi.e. if you can evaluate the
.Expression
to "obj", and the.Member
is aFieldInfo
, then you can get the actual value via.GetValue(obj)
on theFieldInfo
(andPropertyInfo
is very similar).The problem is that evaluating the
.Expression
is very tricky ;-pObviously you get lucky if it turns out to be a
ConstantExpression
- but in most cases it isn't; it could be aParameterExpression
(in which case you'll need to know the actual parameter value that you want to evaluate), or any other combination ofExpression
s.In many cases, a simple (perhaps lazy) option is to use
.Compile()
to get the .NET framework to do the heavy lifting; you can then evaluate the lambda as a typed delegate (passing in any parameters that the lambda requires). This isn't always an option, however.To show how complex this is; consider this trivial example (where I've hard-coded at every step, rather than testing etc):
thank you so so much to Marc Gravell above. I really appreciated his help.
It turns out, in my case. the problem can be solved via:
Thanks again Mark!