2010-01-29 57 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

相关问题