LinqKit System.InvalidCastException при вызове выражения, предоставленного методом, в свойстве-члене
-
23-09-2019 - |
Вопрос
Учитывая простую структуру родительского/дочернего класса.Я хочу использовать linqkit для применения дочернего лямбда-выражения к родительскому.Я также хочу, чтобы лямбда-выражение предоставлялось служебным методом.
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.
Если вы используете вар...затем Bar.GetLambdaX();вызывается и присваивается, значение которого (которое является лямбда-выражением) используется позже в lx =...
Не связан с StackOverflow