【问题标题】:Create Func<T, bool> from MemberExpression and Constant从 MemberExpression 和 Constant 创建 Func<T, bool>
【发布时间】:2013-04-17 17:49:10
【问题描述】:

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

基本上我要创建的是m.MyProperty == 1,用于采用Func&lt;T, bool&gt; 的方法。

我已经有一个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();

【问题讨论】:

    标签: c# .net lambda expression expression-trees


    【解决方案1】:

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

    【讨论】:

    • MemberExpression 是从另一个接受( Expression&lt;Func&lt;T, object&gt;&gt; propertyExression ) 的方法创建的,该表达式被转换为MemberExpression 并存储以供以后使用。那么有没有办法取出参数呢?
    • @JoshClose 我不知道从基于它的表达式中提取参数表达式的可靠方法。您始终可以使用ExpressionVisitor 遍历表达式树,但如果在内部表达式的某处使用多个参数表达式,您得到的结果可能不可靠。
    • @JoshClose 那么你应该修改那个方法。
    • 我可以通过 var pe = (ParameterExpression)memberExpression.Expression 获得 ParameterExpression。正如你现在所说的那样有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多