【问题标题】:how to get parameter names from an expression tree?如何从表达式树中获取参数名称?
【发布时间】:2010-01-29 15:03:01
【问题描述】:

我有这种类型的表达式:

Expression<Action<T>> expression

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

示例:

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

名称可以是 str_par1、int_par2、obj_par3

【问题讨论】:

  • 我的意思是值 o => o.Method( "value") // Method(string s) s is name

标签: c# expression-trees


【解决方案1】:
Expression<Action<Thing>> exp = o => o.Method(1, 2, 3);
var methodInfo = ((MethodCallExpression)exp.Body).Method;
var names = methodInfo.GetParameters().Select(pi => pi.Name);

【讨论】:

  • 对于那些希望对构造函数调用执行相同操作的人,请将主体转换为 NewExpression 并访问 .Constructor 属性。我这样做是为了在测试 ctor 抛出 ArgumentNullExceptions 并在消息中包含 arg 的名称而不在测试中对名称进行硬编码时处理名称更改。
【解决方案2】:

您可以从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 =&gt; i.ToString(),哪里有参数值?

【讨论】:

  • 我其实想要方法的参数名o => o.Method(par1, par2, par3)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    expression.Parameters[0].Name
    

    供您将来参考,文档在这里:

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

    (可选:和值)?

    这对我来说没有任何意义。你能解释一下“和价值观”是什么意思吗?

    【讨论】:

    • 我的意思是值 o => o.Method( "value") // Method(string s) s is name
    • 我其实想要方法的参数名o => o.Method(par1, par2, par3)
    【解决方案5】:

    其实我想要的是方法的参数名 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]
    

    供您将来参考,文档在这里:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      相关资源
      最近更新 更多