从MemberExpression和Constant </t,>创建Func <t,bool =“”>

时间:2013-04-17 17:49:11

标签: c# .net 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();

这给了我一个例外:

  

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();

1 个答案:

答案 0 :(得分:6)

这不起作用的原因是您在编译lambda时使用的是“独立”参数表达式。您应该在制作Expression.Parameter( typeof( T ))之前创建memberExpression ,并在制作成员表达式时使用ParameterExpression的{​​em>实例当你编译lambda时:

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