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)
这不起作用的原因是您在编译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)
| 归档时间: |
|
| 查看次数: |
1786 次 |
| 最近记录: |