2012-03-29 9 views
6
public class Demo 
{  
    public void When(Func<Person, bool> condition) 
    { 
     if (!condition) 
     { 
      Log.Info("Condition not met."); 
      return; 
     } 

     // Do something 
    } 
} 

Im When Methode würde ich, wenn ein Prädikat oder Func<bool> false zurück anmelden möchten. Die Protokollierung "Bedingung nicht erfüllt" gibt mir jedoch nicht viele Informationen. Wenn ich die Methode, wie so nennen:Logging Lambda-Ausdrücke

demo.When(x => x.Name == "John"); 

Gibt es eine Möglichkeit, dass die Expression in eine lesbare/sinnvolle Zeichenfolge zur Protokollierung zu konvertieren?

+0

Stimmen Sie mit @Kirk Woll unten. Und vorausgesetzt, Sie möchten Ihre Methodensignatur nicht ändern, sind Sie wahrscheinlich SOL. Siehe dazu: http://stackoverflow.com/questions/767733/converting-a-net-funct-to-a-net-expressionfunct. –

Antwort

10

Es gibt nicht viel nützliche Metadaten in einem gewöhnlichen Lambda. Sie konnte Verwendung Ausdruck Bäume statt:

void When(Expression<Func<Person, bool>> condition) 
{ 
    var person = new Person(); 
    if (!condition.Compile()(person)) 
    { 
     Console.WriteLine("Condition not met: " + condition); 
     return; 
    } 
} 

Dann am Aufrufort:

When(x => false); 

und der Ausgang wird sein:

Bedingung nicht erfüllt: x => False

Jedoch stellen Expressionsbäume al ot mehr Overhead, und condition.Compile ist auch nicht billig. Daher kann ich diesen Ansatz im Allgemeinen nicht empfehlen, aber es wird nützliche Informationen ausgeben, wie Sie möchten.