2010-04-02 4 views
17

Data una semplice struttura di classe genitore/figlio. Voglio usare linqkit per applicare un'espressione lambda child sul genitore. Voglio anche che l'espressione Lambda sia fornita da un metodo di utilità.LinqKit System.InvalidCastException Durante il richiamo dell'espressione fornita dal metodo sulla proprietà membro

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

Il codice di cui sopra tiri

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) 
+0

Stavo per aiutare ma non riesco a compilare il codice. La linea lx non funziona. – Nix

+0

Compila per me, la linea lx dovrebbe essere ad esempio un metodo util – user293499

risposta

26
var lambdaX = Bar.GetLambdaX(); 

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

Questo funziona.

stare attenti con la scrittura

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

Prima di assegnazione dei processi compilatore questa linea e nel tuo caso crea un Expression metodo di chiamata (vale a dire per la chiamata Bar.GetLambdaX()) che viene assegnato a lx.

Se si utilizza var ... quindi Bar.GetLambdaX(); viene chiamato e assegnato, il cui valore (che è l'espressione lambda) viene utilizzato successivamente in lx = ...

+2

+1 Buona risposta! Le differenze contestuali di come il compilatore tratta le istruzioni all'interno di espressioni lambda possono portare a errori di compilazione molto intuitivi. –

+0

@DoctorJones Questo non è un errore del compilatore. Questo è solo un bug in LINQKit. Non supporta questa situazione quando dovrebbe. Potrebbe essere scritto per supportare questo codice e funzionare correttamente (ho la mia versione dello stesso strumento che gestisce questo codice bene), semplicemente non lo era. – Servy

+0

Non ho detto che si trattava di un errore del compilatore (cioè un errore con il compilatore), ho detto che si trattava di un errore di compilazione (e di un errore verificatosi durante la compilazione). Sono d'accordo che sarebbe bello se LINQKit fosse supportato da questo, anch'io ho la mia versione di LINQKit che gestisce più situazioni di quanto non sia fuori dalla scatola. –

Problemi correlati