Помните, что когда вы имеете дело с лямбда-выражением в виде дерева выражений, у вас нет исполняемого кода. Скорее у вас есть дерево элементов выражения, которые составляют написанное вами выражение.
У Чарли Калверта есть хороший пост , в котором это подробно обсуждается. Включен пример использования визуализатора выражений для отладки выражений.
В вашем случае, чтобы получить значение правой части выражения равенства, вам нужно создать новое лямбда-выражение, скомпилировать его и затем вызвать.
Я собрал краткий пример этого - надеюсь, он даст то, что вам нужно.
public class Class1
{
public string Selection { get; set; }
public void Sample()
{
Selection = "Example";
Example<Book, bool>(p => p.Title == Selection);
}
public void Example<T,TResult>(Expression<Func<T,TResult>> exp)
{
BinaryExpression equality = (BinaryExpression)exp.Body;
Debug.Assert(equality.NodeType == ExpressionType.Equal);
// Note that you need to know the type of the rhs of the equality
var accessorExpression = Expression.Lambda<Func<string>>(equality.Right);
Func<string> accessor = accessorExpression.Compile();
var value = accessor();
Debug.Assert(value == Selection);
}
}
public class Book
{
public string Title { get; set; }
}