我有这种类型的表达式:
Expression<Action<T>> expression
如何从此表达式中获取参数名称(可选:和值)?
示例:
o => o.Method("value1", 2, new Object());
名称可以是str_par1,int_par2,obj_par3
答案 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