2012-03-29 55 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也不便宜。所以我通常不能推薦這種方法,但它會輸出你想要的有用信息。