2010-01-29 41 views
8

我有這種類型的表達式:如何從表達式樹中獲取參數名稱?

Expression<Action<T>> expression 

如何從這個表達式得到的參數名稱(可選:和值)?

例如:

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

名稱可以str_par1,int_par2,obj_par3

+1

你的價值觀是什麼意思? – jason 2010-01-29 15:12:42

+0

我的意思是o => o.Method(「value」)//方法(字符串s)s是名字 – Omu 2010-01-29 15:22:45

回答

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

你可以從Parameters屬性的參數名稱。

例如:

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

對於第二部分,lambda表達式都只是未編譯的功能。
在您編譯表達式並使用某些值調用委託之前,它們的參數沒有值。

如果您採用lambda表達式i => i.ToString(),哪裏有任何參數值?

+1

我實際上想要方法參數的名稱o => o.Method(par1,par2,par3 ) – Omu 2010-01-29 15:30:02

2

如何從該表達式中獲取參數名稱?

expression.Parameters[0].Name 

以備將來參考,文件是在這裏:

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

(可選:和值)?

這對我沒有任何意義。你能解釋一下你和「價值觀」的含義嗎?

+0

by values我的意思是o => o.Method(「value」)//方法(字符串s)s是名字 – Omu 2010-01-29 15:21:23

+0

我實際上想要方法的參數名稱o => o.Method(par1,par2, PAR3) – Omu 2010-01-29 15:30:17

2

我其實想的方法O的參數名稱=> o.Method(PAR1,PAR2,PAR3)

你有一些信念,我們的心靈,也許。

無論如何,繼續前進。

我實際上想要方法的參數名稱o => o。方法(PAR1,PAR2,PAR3)

第一次正式參數的名稱是:

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

這是第一個參數是

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

以備將來參考的表達,文檔在這裏:

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

相關問題