LinqKit System.InvalidCastException al invocar la expresión método proporcionado en la propiedad de miembro
-
23-09-2019 - |
Pregunta
Dada una estructura de clases padre / hijo sencilla. Quiero usar linqkit aplicar una expresión lambda niño en la matriz. También quiero la expresión Lambda a ser proporcionado por un método de utilidad.
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());
El código anterior arroja
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)
Solución
var lambdaX = Bar.GetLambdaX();
Expression<Func<Foo, bool>> lx = c => lambdaX.Invoke(c.Bar);
Esto funciona.
Tenga cuidado con la escritura
Expression<Func<Foo, bool>> lx = ...
Antes de la asignación al compilador procesa esta línea y en su caso se crea un método de llamada de expresión (es decir, para llamar Bar.GetLambdaX ()) que se asigna a lx.
Si utiliza var ... entonces Bar.GetLambdaX (); se llama y asignado, el valor de los cuales (que es la expresión lambda) se utiliza más adelante en lx = ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow