2013-07-16 8 views
5

wie kann ich einen Körper aus FunktionKörper aus Func <T>

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

ich dieses "output.SendToFile()" erhalten müssen als String

Ein weiteres Beispiel

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

Ich verstehe nicht ganz, was du bist fragend. Möchten Sie eine Methode, die Sie "methodCall" übergeben können und es zurückgegeben "output.SendToFile()"? Was sollte es für andere Methoden wie 'Console.WriteLine' zurückgeben? – Jens

+0

Ich brauche nur diese Informationen von Lambda "output.SendToFile()" diese Daten kann ich dem Protokoll hinzufügen, wenn ich eine Ausnahme bekommen – Sergey

+0

Könnten Sie Ausnahmebehandlung und Protokollierung in SendToFile tun? Die Methode sollte auch an der Spitze der Ausnahme-Stack-Ablaufverfolgung sein (die Sie vielleicht trotzdem protokollieren sollten). – Jens

Antwort

8

Du kannst nicht. A Func<T> ist nichts, was Sie leicht analysieren können. Wenn Sie ein Lambda analysieren möchten, müssen Sie eine Expression<Func<bool>> erstellen und analysieren.

den Körper eines Ausdrucks zu erhalten ist einfach:

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

body ein MethodCallExpression würden Sie weiter oder nur Ausgabe über ToString analysieren konnte. Die Verwendung von ToString ergibt nicht genau das, was Sie haben möchten, aber es enthält auch diese Information.

Zum Beispiel ToString() auf body in LINQPad Ausführung ergibt sich so etwas wie dieses:

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

Wie Sie sehen können, "output.SendToFile()" ist.

Um den Code tatsächlich auszuführen durch einen Ausdruck definiert ist, müssen Sie es zunächst kompilieren:

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

auf das sich diese verkürzt werden kann:

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

Beachten Sie aber, dass Ausdrücke keine Anweisungen enthalten können. –

+0

vielen Dank, ich denke, es wird genug für die Protokollinformationen sein – Sergey

Verwandte Themen