LinqKit System.InvalidCastException当调用上部件特性的方法提供的表达
-
23-09-2019 - |
题
给定一个简单的父/子类结构。我想用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 = ...
稍后用于不隶属于 StackOverflow