LinqKit Sistema.InvalidCastException Quando si richiama il metodo fornito espressione di proprietà di un membro

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

Domanda

Un semplice genitore/figlio, la struttura di classe.Voglio usare linqkit per applicare un bambino di espressione lambda sul padre.Anche io voglio l'espressione Lambda per essere fornito da un metodo di utilità.

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

Il codice sopra e getta

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)
È stato utile?

Soluzione

var lambdaX = Bar.GetLambdaX();

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

Questo funziona.

Attenzione con la scrittura

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

Prima assegnazione il compilatore processi di questa linea e nel tuo caso, crea una Chiamata ad un Metodo di Espressione (es.per la chiamata di un Bar.GetLambdaX()) che viene assegnato a lx.

Se si utilizza var ...poi Bar.GetLambdaX();viene chiamato e ricevuto, il cui valore (che è l'espressione lambda) è utilizzato in seguito in lx = ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top