2013-07-16 12 views
5

come posso ottenere un corpo dalla funzione diCorpo da Funz <T>

Func<bool> methodCall =() => output.SendToFile(); 
     if (methodCall()) 
     Console.WriteLine("Success!"); 

ho bisogno di fare questo "output.SendToFile()" come una stringa

Un altro esempio

string log = ""; 
    public void Foo<T>(Func<T> func) 
    { 
     try 
     { 
      var t = func(); 

     } 
     catch (Exception) 
     { 
      //here I need to add the body of the lambda 
      // log += func.body; 
     } 
    } 

public void Test() 
     { 
      var a = 5; 
      var b = 6; 
      Foo(() => a > b); 
     } 
+1

io non capisco quello che sei chiedendo. Vuoi un metodo per passare "methodCall" e restituirlo "output.SendToFile()"? Cosa dovrebbe restituire per altri metodi, come 'Console.WriteLine'? – Jens

+0

Ho solo bisogno di ottenere queste informazioni da lambda "output.SendToFile()" questi dati che posso aggiungere al log, se otterrò un'eccezione – Sergey

+0

Potresti eseguire la gestione delle eccezioni e la registrazione all'interno di SendToFile? Il metodo dovrebbe trovarsi in cima alla traccia dello stack di eccezioni (che probabilmente dovresti comunque registrare). – Jens

risposta

8

Non puoi A Func<T> non si può facilmente analizzare. Se si desidera analizzare un lambda, è necessario creare un Expression<Func<bool>> e analizzarlo.

ottenere il corpo di un'espressione è semplice:

Expression<Func<bool>> methodCall =() => output.SendToFile(); 
var body = methodCall.Body; 

body sarebbe un MethodCallExpression si potrebbe analizzare ulteriormente o semplicemente uscita tramite ToString. L'utilizzo di ToString non corrisponde esattamente a ciò che vorresti avere, ma contiene anche quell'informazione.

Per esempio, l'esecuzione di ToString() su body in LINQPad si traduce in qualcosa di simile:

value(UserQuery+<>c__DisplayClass0).output.SendToFile() 

Come si può vedere, "output.SendToFile()" c'è.

Per eseguire in realtà il codice definito da un'espressione, è necessario prima compilare:

var func = methodCall.Compile(); 
func(); 

Che può essere ridotto a questo:

methodCall.Compile()(); // looks strange but is valid. 
+5

Ma si noti che le espressioni non possono contenere istruzioni. –

+0

grazie mille, penso che sarà sufficiente per le informazioni del registro – Sergey

Problemi correlati