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

     // Do something 
    } 
} 

Trong phương thức When, tôi muốn đăng nhập khi vị từ hoặc Func<bool> trả về giá trị sai. Tuy nhiên, chỉ cần đăng nhập "điều kiện không đáp ứng" không cung cấp cho tôi nhiều thông tin. Nếu tôi gọi phương thức như vậy:Ghi biểu thức lambda

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

Có cách nào để chuyển đổi biểu thức đó thành chuỗi có thể đọc/có ý nghĩa cho mục đích ghi nhật ký không?

+0

Đồng ý với @Kirk Woll bên dưới. Và giả sử bạn không muốn thay đổi chữ ký phương thức của mình, bạn có khả năng SOL. Xem liên quan: http://stackoverflow.com/questions/767733/converting-a-net-funct-to-a-net-expressionfunct. –

Trả lời

10

Không có nhiều dữ liệu meta hữu ích trong một lambda thông thường. Bạn thể cây biểu hiện sử dụng thay vì:

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

Sau đó, tại địa điểm cuộc gọi:

When(x => false); 

Và kết quả sẽ là:

Điều kiện không được đáp ứng: x => False

Tuy nhiên, cây biểu thị giới thiệu ot chi phí cao hơn, và condition.Compile cũng không rẻ. Vì vậy, tôi thường không thể đề xuất phương pháp này, nhưng nó sẽ đưa ra các thông tin hữu ích như bạn muốn.