2013-02-16 17 views
5

Ho un Func come questo:Come convertire Func <T,bool> a Expression <Func<T,bool>>

Func<MyClass, bool> func = x=>Id == 5; 

Come posso convertirlo in:

Expression<Func<MyClass, bool>> 
+1

L'espressione è una rappresentazione intermedia di una funzione Lambda. Func è la funzione lambda compilata stessa. Non pensare di poter convertire tra i due. Perché hai bisogno di farlo? – akhisp

risposta

3

provate questo:

Func<MyClass, bool> func = x=>Id == 5; 
Expression<Func<MyClass, bool>> expr = mc => func(mc); 
+1

In questo modo si imposta 'expr' come chiamata a un delegato che accetta un' MyClass' e restituisce un 'bool'. 'expr' non manterrà un albero di sintassi per l'attuale lambda. – Sean

+0

Sì, lo è. E allora? Forse l'autore della domanda dovrebbe essere proprio questo. – Memoizer

+1

Questa risposta non dovrebbe essere accettata. Il metodo non viene convertito in espressione di sorta. –

2

È possibile creare un'espressione che rappresenti la chiamata al delegato creato. Ma la maggior parte delle volte, quando si utilizza Expression s, lo si fa per capire cosa fa il codice (ad esempio per convertirlo in SQL). E non puoi farlo con un'espressione per invocare una funzione opaca.

9

Si può solo scrivere:

Expression<Func<MyClass,bool>> expr = x=>Id == 5; 

questo imposterà expr di essere un albero di espressione per Id == 5.

Se lo fai:

Func<MyClass, bool> func = x=>Id == 5; 
Expression<Func<MyClass, bool>> expr = mc => func(mc); 

allora questo sarà impostato expr di essere un albero di espressione per una chiamata a func, non un albero di espressione per il corpo del func.

Problemi correlati