2010-01-29 57 views
8

Tôi có một biểu hiện của loại hình này:cách lấy tên tham số từ cây biểu thức?

Expression<Action<T>> expression 

làm thế nào để tôi nhận được những cái tên thông số từ biểu thức này (không bắt buộc: và giá trị)?

dụ:

o => o.Method("value1", 2, new Object()); 

tên có thể được str_par1, int_par2, obj_par3

+1

Ý của bạn là gì? – jason

+0

bởi các giá trị tôi có nghĩa là o => o.Method ("value") // Phương thức (string s) s là tên – Omu

Trả lời

16
Expression<Action<Thing>> exp = o => o.Method(1, 2, 3); 
var methodInfo = ((MethodCallExpression)exp.Body).Method; 
var names = methodInfo.GetParameters().Select(pi => pi.Name); 
4

Bạn có thể lấy tên tham số từ Parameters tài sản.

Ví dụ:

Expression<Action<string, int>> expr = (a, b) => (a + b).ToString(); 
var names = expr.Parameters.Select(p => p.Name); //Names contains "a" and "b" 

Đối với phần thứ hai, biểu thức lambda là chức năng chỉ uncompiled.
Thông số của chúng không có giá trị cho đến khi bạn biên dịch biểu thức và gọi đại biểu với một số giá trị.

Nếu bạn sử dụng biểu thức lambda i => i.ToString(), thì có bất kỳ giá trị tham số nào?

+1

Tôi thực sự muốn tên của các tham số của phương thức o => o.Method (par1, par2, par3) – Omu

2

Làm cách nào để lấy tên tham số từ biểu thức này?

expression.Parameters[0].Name 

Để tham khảo trong tương lai của bạn, tài liệu là ở đây:

http://msdn.microsoft.com/en-us/library/bb359453.aspx

(không bắt buộc: và giá trị)?

Điều này không có ý nghĩa với tôi. Bạn có thể giải thích ý nghĩa của bạn bằng "và giá trị" không?

+0

bởi các giá trị tôi có nghĩa là o => o.Method ("value") // Phương thức (string s) s là tên – Omu

+0

Tôi thực sự muốn tên của các tham số của phương thức o => o.Method (par1, par2, par3) – Omu

2

Tôi thực sự muốn tên của các tham số của phương pháp o => o.Method (par1, par2, par3)

Bạn có một số niềm tin rằng chúng tôi tâm linh, có lẽ .

Dù sao, hãy tiếp tục.

Tôi thực sự muốn tên của các tham số của phương thức o => o.Phương pháp (par1, par2, par3)

Tên của tham số chính thức đầu tiên là:

(expression.Body as MethodCallExpression).Method.GetParameters()[0].Name 

Khái niệm đó là số đầu tiên là

(expression.Body as MethodCallExpression).Arguments[0] 

Để tham khảo trong tương lai của bạn, tài liệu có tại đây:

http://msdn.microsoft.com/en-us/library/system.linq.expressions.methodcallexpression.arguments.aspx

Các vấn đề liên quan