给定一个简单的父/子类结构。我想用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)
有帮助吗?

解决方案

var lambdaX = Bar.GetLambdaX();

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

此工作。

要小心书写

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

分配之前编译器处理这一行和你的情况创建一个方法调用的表达(即,用于呼叫Bar.GetLambdaX())被分配给LX。

如果您使用VAR ...然后Bar.GetLambdaX();叫和分配,其值(其是λ表达式)是在1x = ...

稍后用于
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top