MSDN官方示例:// Add the following using directive to your code file:
// using System.Linq.Expressions;
// Create an expression tree.
Expression<Func<int, bool>> exprTree = num => num < 5;
// Decompose the expression tree.
ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
BinaryExpression operation = (BinaryExpression)exprTree.Body;
ParameterExpression left = (ParameterExpression)operation.Left;
ConstantExpression right = (ConstantExpression)operation.Right;
Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}",
                  param.Name, left.Name, operation.NodeType, right.Value);
// This code produces the following output:
// Decomposed expression: num => num LessThan 5 但现在的代码却运行不了,请高手指点:    public class Test
    {
        public void ExpressionTest()
        {
            T t=new T(){ID=1,Name="abc"};
            Expression<Func<T, bool>> exprTree = o => o.ID == t.ID;
            ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
            BinaryExpression operation = (BinaryExpression)exprTree.Body;
            ParameterExpression left = (ParameterExpression)operation.Left;//这里出错
            ConstantExpression right = (ConstantExpression)operation.Right;            Console.WriteLine("Decomposed expression:{0}=>{1}{2}{3}",
                param.Name,left.Name,operation.NodeType,right.Value);        }
    }
    public class T
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }ParameterExpression left = (ParameterExpression)operation.Left;这一句出错

解决方案 »

  1.   

    修改为 MemberExpression left = (MemberExpression)operation.Left;//这里出错
                MemberExpression right = (MemberExpression)operation.Right;
      

  2.   

    第一个可以,通过left.member.Name;取到了"ID"值,但第二个不行,取不取值“1”
      

  3.   

    你说right的值是1吗?http://blog.zhaojie.me/2010/05/generate-dynamic-method-with-expression-tree-in-dot-net-4.html
      

  4.   

    获取1的方法,只能是将MemberExpression弄成一个新的Lambda,然后编译获取值。Expression.Lambda(right).Compile().DynamicInvoke()