我没有足够的表达树来完成这项工作......
基本上我想创建的是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();
答案 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