LinqKit System.InvalidCastException expression lors de l'appel fourni procédé sur propriété de membre

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

Question

Compte tenu d'une simple structure de classe parent / enfant. Je veux utiliser linqkit pour appliquer une expression lambda de l'enfant du parent. Je veux aussi l'expression Lambda à fournir par une méthode utilitaire.

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

Le code ci-dessus lance

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)
Était-ce utile?

La solution

var lambdaX = Bar.GetLambdaX();

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

Cela fonctionne.

Soyez prudent avec l'écriture

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

Avant affectation Les processus du compilateur cette ligne et dans votre cas crée une expression d'appel de la méthode (à savoir pour appeler Bar.GetLambdaX ()) qui est attribué à lx.

Si vous utilisez var ... puis Bar.GetLambdaX (); est appelé et affecté, dont la valeur (ce qui est l'expression lambda) est utilisée plus tard dans lx = ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top