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

C# 如何从表达式树中获取参数名?,c#,expression-trees,C#,Expression Trees,我有一个这种类型的表达式: Expression<Action<T>> expression 名称可以是str_par1、int_par2、obj_par3您可以从Parameters属性获取参数名称 例如: Expression<Action<string, int>> expr = (a, b) => (a + b).ToString(); var names = expr.Parameters.Select(p => p

我有一个这种类型的表达式:

Expression<Action<T>> expression

名称可以是str_par1、int_par2、obj_par3

您可以从
Parameters
属性获取参数名称

例如:

    Expression<Action<string, int>> expr = (a, b) => (a + b).ToString();
var names = expr.Parameters.Select(p => p.Name);  //Names contains "a" and "b"
表达式expr=(a,b)=>(a+b).ToString();
var Name=expr.Parameters.Select(p=>p.Name)//名称包含“a”和“b”
对于第二部分,lambda表达式只是未编译的函数。
在编译表达式并使用某些值调用委托之前,它们的参数没有值

如果采用lambda表达式
i=>i.ToString()
,那么参数值在哪里

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

以下文件供您将来参考:

(可选:和值)


这对我来说毫无意义。你能解释一下“和值”是什么意思吗?

方法的参数?从表达式中获取
MethodInfo
(猜测,),然后使用获取参数。(具有各种有用的属性,包括)。

表达式exp=o=>o.Method(1,2,3);
var methodInfo=((MethodCallExpression)exp.Body).Method;
var Name=methodInfo.GetParameters().Select(pi=>pi.Name);

我实际上想要方法o=>o.method(par1,par2,par3)的参数名

也许你相信我们是通灵的

不管怎样,继续


我实际上想要方法o=>o.method(par1,par2,par3)的参数名

第一个形式参数的名称为:

(expression.Body as MethodCallExpression).Method.GetParameters()[0].Name
作为第一个参数的表达式是

(expression.Body as MethodCallExpression).Arguments[0]
以下文件供您将来参考:


通过值我指的是o=>o.Method(“value”)//方法(字符串s)s是名称我实际上想要方法o=>o.Method(par1,par2,par3)的参数名称通过值我指的是o=>o.Method(“value”)//方法(字符串s)s是名称我实际上想要方法o=>o.Method(par1,par2,par3)的参数名称对于那些希望对构造函数调用执行相同操作的人,将主体强制转换为
NewExpression
,并访问
.constructor
属性。我这样做是为了在测试ctor抛出
ArgumentNullExceptions
并在消息中包含arg的名称时处理名称更改,而不在测试中硬编码名称。
Expression<Action<Thing>> exp = o => o.Method(1, 2, 3);
var methodInfo = ((MethodCallExpression)exp.Body).Method;
var names = methodInfo.GetParameters().Select(pi => pi.Name);
(expression.Body as MethodCallExpression).Method.GetParameters()[0].Name
(expression.Body as MethodCallExpression).Arguments[0]