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
Expressionto aMemberExpression.A
MemberExpressionhas two things of interest:PropertyInfo/FieldInfoto the memberi.e. if you can evaluate the
.Expressionto ‘obj’, and the.Memberis aFieldInfo, then you can get the actual value via.GetValue(obj)on theFieldInfo(andPropertyInfois very similar).The problem is that evaluating the
.Expressionis 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 ofExpressions.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):