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

     // Do something 
    } 
} 

When方法中,我想记录谓词或Func<bool>何时返回false。然而,只记录“条件不符合”并不能提供很多信息。如果我打电话,像这样的方法:记录拉姆达表达式

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

有没有办法给表达式转换成日志记录可读/有意义的字符串?

+0

同意@Kirk Woll如下。假设你不想改变你的方法签名,你可能是SOL。见相关:http://stackoverflow.com/questions/767733/converting-a-net-funct-to-a-net-expressionfunct。 – 2012-03-29 18:25:32

回答

10

在普通的lambda中没有太多有用的元数据。您可能使用表达式树来代替:

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

然后在调用点:

When(x => false); 

和输出将是:

条件没有得到满足:X =>假

然而,表达树引入了al更多的开销,并且condition.Compile也不便宜。所以我通常不能推荐这种方法,但它会输出你想要的有用信息。