20

给定一个简单的父/子类结构。我想使用 linqkit 在父级上应用子 lambda 表达式。我还希望 Lambda 表达式由实用程序方法提供。

public class Foo
{
    public Bar Bar { get; set; }
}

public class Bar
{
    public string Value { get; set; }
    public static Expression<Func<Bar, bool>> GetLambdaX()
    {
        return c => c.Value == "A";
    }
}
...

Expression<Func<Foo, bool>> lx = c => Bar.GetLambdaX().Invoke(c.Bar);
Console.WriteLine(lx.Expand());

上面的代码抛出

System.InvalidCastException: Unable to cast object of type 
'System.Linq.Expressions.MethodCallExpression' to type 
'System.Linq.Expressions.LambdaExpression'.
at LinqKit.ExpressionExpander.VisitMethodCall(MethodCallExpression m)
at LinqKit.ExpressionVisitor.Visit(Expression exp)
at LinqKit.ExpressionVisitor.VisitLambda(LambdaExpression lambda)
at LinqKit.ExpressionVisitor.Visit(Expression exp)
at LinqKit.Extensions.Expand<TDelegate>(Expression`1 expr)
4

2 回答 2

31
var lambdaX = Bar.GetLambdaX();

Expression<Func<Foo, bool>> lx = c => lambdaX.Invoke(c.Bar);

这行得通。

写字要小心

Expression<Func<Foo, bool>> lx = ...

在分配之前,编译器会处理这一行,并在您的情况下创建分配给 lx 的方法调用表达式(即用于调用 Bar.GetLambdaX())。

如果你使用 var ... 那么 Bar.GetLambdaX(); 被调用并赋值,其值(即 lambda 表达式)稍后在 lx = ... 中使用

于 2010-04-21T21:25:29.837 回答
1

2021 年更新:从 1.1.22 版开始,此错误已得到修复。

2020 年 9 月针对此错误打开了一个问题,并在 2021 年 1 月 16 日发布的 1.1.22 版本中修复了该问题。

于 2021-03-01T14:12:35.273 回答