3

我没有做足够的表达树工作来让这个工作......

本质上,我想要创建的是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();
4

1 回答 1

6

这不起作用的原因是您在编译 lambda 时使用了“独立”参数表达式。您应该在创建Expression.Parameter( typeof( T )) 之前创建,并在创建成员表达式和编译 lambda 时使用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
于 2013-04-17T17:53:23.047 回答