LinqKit System.InvalidCastException beim Aufruf-Verfahren bereitgestellt Ausdruck auf Eigenschaft
-
23-09-2019 - |
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)
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 = ...
verwendetLizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow