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

     // Do something 
    } 
} 

En el método When, me gustaría iniciar sesión cuando un predicado o Func<bool> vuelve falsa. Sin embargo, solo registrar "condición no cumplida" no me da mucha información. Si llamo el método de esta manera:registro de expresiones lambda

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

¿Hay una manera de convertir esa expresión en una cadena legible/significativa para propósitos de registro?

+0

De acuerdo con @Kirk Woll a continuación. Y suponiendo que no desee cambiar la firma de su método, es probable que SOL. Ver relacionados: http://stackoverflow.com/questions/767733/converting-a-net-funct-to-a-net-expressionfunct. –

Respuesta

10

No hay muchos metadatos útiles en una lambda ordinaria. Le podría árboles uso de expresión en su lugar:

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

A continuación, en el lugar llamado:

When(x => false); 

Y la salida será:

Condición no alcanzada: x => Falso

Sin embargo, los árboles de expresión presentan al ot más sobrecarga, y condition.Compile tampoco es barato. Por lo tanto, generalmente no puedo recomendar este enfoque, pero generará información útil como lo desee.