如何从表达式树中获取参数名称?

时间:2010-01-29 15:03:02

标签: c# expression-trees

我有这种类型的表达式:

Expression<Action<T>> expression

如何从此表达式中获取参数名称(可选:和值)?

示例:

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

名称可以是str_par1,int_par2,obj_par3

5 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分: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(),那么有哪些参数值?

答案 2 :(得分:3)

Method的参数?从表达式中获取MethodInfo(猜测,MethodCallExpression.Method),然后使用MethodBase.GetParameters()获取参数。 (ParameterInfo具有各种有用的属性,包括Name)。

答案 3 :(得分:2)

  

如何从此表达式中获取参数名称?

expression.Parameters[0].Name

供将来参考,文档在此处:

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

  

(可选:和值)?

这对我没有任何意义。你能用“和价值观”来解释你的意思吗?

答案 4 :(得分:2)

  

我实际上想要方法的参数名称o =&gt; o.Method(par1,par2,par3)

你有一些信念,认为我们可能是精神上的。

无论如何,继续前进。

  

我实际上想要方法的参数名称o =&gt; o.Method(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

相关问题