从MemberExpression和Constant创建Func <T,bool>

Jos*_*ose 3 .net c# lambda expression expression-trees

我不做表达树工作足以让这个工作......

基本上我想要创建的是m.MyProperty == 1,在一个需要的方法中使用Func<T, bool>.

我已经MemberExpression有了.我尝试了各种各样的东西,但我只是不断得到不同的错误.

我目前有类似的东西(这不起作用):

object const = 1;
var equalExpression = Expression.Equal( memberExpression, Expression.Constant( const ) );
var compiled = Expression.Lambda<Func<T, bool>>( equalExpression, Expression.Parameter( typeof( T ) ).Compile();
Run Code Online (Sandbox Code Playgroud)

这给了我一个例外:

System.InvalidOperationException:从范围''引用的'MyType'类型的变量'm',但它未定义

我已经尝试过重新处理这个的几个不同部分,但还没有提出任何有效的方法.

const是一个可以是任何类型的对象,但应该匹配的类型MemberExpression.

解:

object c = 1;
var parameterExpression = (ParameterExpression)memberExpression.Expression;
var equalExpression = Expression.Equal(memberExpression, Expression.Constant(c));
var compiled = Expression.Lambda<Func<T, bool>>(equalExpression, parameterExpression).Compile();
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

这不起作用的原因是您在编译lambda时使用"独立"参数表达式.您应该创建Expression.Parameter( typeof( T )) 之前,让您的memberExpression,并使用相同的情况下ParameterExpression两当你做出一个成员表达,当你编译拉姆达:

var pe = Expression.Parameter( typeof( T )); // <<== Here
var memberExpression = Expression.PropertyOrField(pe /* Here */, "MyProperty");
var equalExpression = Expression.Equal( memberExpression, Expression.Constant( const ) );
var compiled = Expression.Lambda<Func<T, bool>>( equalExpression, pe ).Compile();
//                                                                ^^
//                                                                ||
//                                                             And here
Run Code Online (Sandbox Code Playgroud)