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

     // Do something 
    } 
} 

Nel metodo When, vorrei registrare quando un predicato o Func<bool> restituisce false. Tuttavia, la sola registrazione "condizione non soddisfatta" non mi dà molte informazioni. Se chiamo il metodo in questo modo:registrazione Espressioni lambda

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

C'è un modo per convertire questa espressione in una stringa leggibile/significativo per scopi di registrazione?

+0

Accetto con @Kirk Woll di seguito. E supponendo che tu non voglia cambiare la tua firma del metodo, probabilmente sei SOL. Vedi correlati: http://stackoverflow.com/questions/767733/converting-a-net-funct-to-a-net-expressionfunct. –

risposta

10

Non ci sono molti metadati utili in un lambda ordinario. Voi potrebbe alberi usare l'espressione invece:

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

Poi al sito di chiamata:

When(x => false); 

E l'uscita sarà:

Condizione non soddisfatti: x => False

Tuttavia, gli alberi di espressione introducono o altro overhead, e condition.Compile non è economico neanche. Quindi in genere non posso raccomandare questo approccio, ma produrrà informazioni utili come vuoi tu.