2013-07-16 42 views
5

làm thế nào tôi có thể có được một cơ thể từ chức năngBody từ Func <T>

Func<bool> methodCall =() => output.SendToFile(); 
     if (methodCall()) 
     Console.WriteLine("Success!"); 

tôi cần phải có được điều này "output.SendToFile()" như là một chuỗi

Một ví dụ khác

string log = ""; 
    public void Foo<T>(Func<T> func) 
    { 
     try 
     { 
      var t = func(); 

     } 
     catch (Exception) 
     { 
      //here I need to add the body of the lambda 
      // log += func.body; 
     } 
    } 

public void Test() 
     { 
      var a = 5; 
      var b = 6; 
      Foo(() => a > b); 
     } 
+1

tôi không hoàn toàn hiểu những gì bạn đang hỏi. Bạn có muốn một phương thức bạn có thể truyền vào "methodCall" vào và có nó trả về "output.SendToFile()" không? Điều gì sẽ trở lại cho các phương thức khác, như 'Console.WriteLine'? – Jens

+0

Tôi chỉ cần lấy thông tin này từ lambda "output.SendToFile()" dữ liệu này tôi có thể thêm vào nhật ký, nếu tôi nhận được ngoại lệ – Sergey

+0

Bạn có thể xử lý ngoại lệ và ghi nhật ký bên trong SendToFile không? Phương pháp này cũng phải ở trên cùng của dấu vết ngăn xếp ngoại lệ (bạn có thể vẫn nên ghi nhật ký). – Jens

Trả lời

8

Bạn không thể. A Func<T> không là gì bạn có thể dễ dàng phân tích. Nếu bạn muốn phân tích một lambda, bạn cần phải tạo ra một Expression<Func<bool>> và phân tích nó.

Bắt cơ thể của một biểu thức rất đơn giản:

Expression<Func<bool>> methodCall =() => output.SendToFile(); 
var body = methodCall.Body; 

body sẽ là một MethodCallExpression bạn có thể tiếp tục phân tích hoặc chỉ ra qua ToString. Sử dụng ToString sẽ không dẫn đến chính xác những gì bạn muốn có, nhưng nó cũng chứa thông tin đó.

Ví dụ, thực hiện ToString() trên body trong LINQPad dẫn đến một cái gì đó như thế này:

value(UserQuery+<>c__DisplayClass0).output.SendToFile() 

Như bạn thấy, "output.SendToFile()" là ở đó.

Để thực sự thực thi mã xác định bởi một biểu thức, trước tiên bạn cần phải biên dịch nó:

var func = methodCall.Compile(); 
func(); 

Mà có thể được rút ngắn xuống còn này:

methodCall.Compile()(); // looks strange but is valid. 
+5

Nhưng lưu ý rằng các biểu thức không thể chứa câu lệnh. –

+0

cảm ơn rất nhiều, tôi nghĩ rằng nó sẽ là đủ cho thông tin nhật ký – Sergey