una requiere referencia puede propiedad para objeto método inicializador hacer estáticos campo c# linq entity-framework expression-trees linqkit

c# - requiere - LinqKit System.InvalidCastException cuando se invoca una expresión proporcionada por el método en la propiedad del miembro



se requiere una referencia de objeto para el campo método o propiedad no estáticos c# (1)

Dada una estructura simple de clase padre / hijo. Quiero usar linqkit para aplicar una expresión lambda hija en el padre. También quiero que la expresión Lambda sea proporcionada 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)


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

Esto funciona.

Ten cuidado con la escritura

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

Antes de la asignación, el compilador procesa esta línea y en su caso crea una Expresión de llamada de método (es decir, para llamar a Bar.GetLambdaX ()) que está asignada a lx.

Si usa var ... entonces Bar.GetLambdaX (); se llama y se asigna, cuyo valor (que es la expresión lambda) se usa más adelante en lx = ...