LinqKit System.InvalidCastException При вызове выражения, предоставленного методом, для свойства элемента - PullRequest
18 голосов
/ 02 апреля 2010

Учитывая простую структуру родительских / дочерних классов. Я хочу использовать 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)

1 Ответ

29 голосов
/ 22 апреля 2010
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 (); вызывается и присваивается, значение которого (которое является лямбда-выражением) используется позже в lx = ...

...