Frage

Bei einer einfachen Eltern / Kind-Klassenstruktur. Ich möchte linqkit verwenden, um ein Kind Lambda-Ausdruck auf dem übergeordneten anzuwenden. Ich möchte auch der Lambda-Ausdruck durch eine Hilfsmethode zur Verfügung gestellt werden.

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

Der obige Code wirft

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)
War es hilfreich?

Lösung

var lambdaX = Bar.GetLambdaX();

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

Das funktioniert.

Seien Sie vorsichtig mit dem Schreiben

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

Vor der Zuordnung verarbeitet der Compiler diese Zeile und in Ihrem Fall erzeugt einen Methodenaufruf Ausdruck (das heißt für den Aufruf Bar.GetLambdaX ()), die auf lx zugeordnet ist.

Wenn Sie var verwenden ... dann Bar.GetLambdaX (); genannt und zugeordnet ist, deren Wert (das ist der Lambda-Ausdruck ist) wird später in lx = ...

verwendet
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top