Linqkit System.InvalidCastException Ao invocar a expressão fornecida pelo método na propriedade do membro

StackOverflow https://stackoverflow.com/questions/2564975

Pergunta

Dada uma estrutura simples de classe de pai/filho. Quero usar o Linqkit para aplicar uma expressão infantil lambda no pai. Eu também quero que a expressão lambda seja fornecida por um método de utilidade.

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());

O código acima joga

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)
Foi útil?

Solução

var lambdaX = Bar.GetLambdaX();

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

Isso funciona.

Tenha cuidado com a escrita

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

Antes da atribuição, o compilador processa essa linha e, no seu caso, cria uma expressão de chamada de método (ou seja, para chamar o bar.getLambdax ()) atribuído ao LX.

Se você usa var ... então bar.getLambdax (); é chamado e atribuído, cujo valor (que é a expressão lambda) é usado posteriormente em lx = ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top