Expression.Body在静态方法调用中删除类

时间:2014-08-05 11:22:40

标签: c# expression-trees

我有一个带有某个Lambda的Expression,看起来像这样:

Expression<Func<string[],int>> expression = p => int.Parse(p[0]) * int.Parse(p[1])

当我打电话给表情。身体,我得到:

(Parse(p[0]) * Parse(p[1]))

如果表达式是这样的:

Expression<Func<string[],int>> expression = p => p[0].ToInt() * p[1]ToInt()

当然,表达式会从静态方法中切断类,并使用它做一些事情。

我的问题是,如何获得排除类的字符串表示? 它在哪里存储静态方法?我可以string.Format()获得完整身体的属性吗?

P.S。我不需要运行表达式,我知道当我打电话给expression.Invoke时它会起作用。因为我使用CodeDom,所以我需要精确的表达体

1 个答案:

答案 0 :(得分:1)

Expression.ToString()会实例化一个ExpressionStringBuilder,遗憾的是internal sealed,因此您无法为此做很多事情。

See the relevant source code

您可以尝试以下解决方法:

  • 创建ExpressionVisitor
  • 的子类
  • 在构造函数中实例化StringBuilder
  • 覆盖VisitMethodCall以实现您的逻辑并将字符串附加到StringBuilder。使用MethodInfo.DeclaringType访问方法的类型。
  • 对于其他节点类型,只需将node.ToString()附加到StringBuilder(重复使用现有功能)。