C# Expression.Body在静态方法调用时删除类

C# Expression.Body在静态方法调用时删除类,c#,expression-trees,C#,Expression Trees,我有一个表达式,其中有一个Lambda,看起来像这样: Expression<Func<string[],int>> expression = p => int.Parse(p[0]) * int.Parse(p[1]) Expression<Func<string[],int>> expression = p => p[0].ToInt() * p[1]ToInt() 如果表达式如下所示: Expression<Func&l

我有一个表达式,其中有一个Lambda,看起来像这样:

Expression<Func<string[],int>> expression = p => int.Parse(p[0]) * int.Parse(p[1])
Expression<Func<string[],int>> expression = p => p[0].ToInt() * p[1]ToInt()
如果表达式如下所示:

Expression<Func<string[],int>> expression = p => int.Parse(p[0]) * int.Parse(p[1])
Expression<Func<string[],int>> expression = p => p[0].ToInt() * p[1]ToInt()
Expression=p=>p[0].ToInt()*p[1]ToInt()
很自然,表达式将类从静态方法中切断,并对其进行处理

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

p、 我不需要运行表达式,我知道当我调用
expression.Invoke
时它会工作。因为我使用的是CodeDom,所以我需要精确的表达式体。ToString()将实例化一个
ExpressionStringBuilder
,不幸的是,它是
内部密封的
,因此您无法对此做太多工作

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

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

您是否查看了表达式树的实际内容?我怀疑这只是
ToString
结果的一个问题-您对此有多在意?你在用它做什么?请提供一个你想要的输出的例子。@Lucas,我想要的输出是
int.Parse(p[0])*int.Parse(p[1])
只是在静态方法name.hi@JonSkeet之前添加类名。正如我写的,这个表达式正在粘贴到CodeDom编译器并被执行。我不知道这是否是一个
ToString
问题,因为我在IntelliSense上看到了这个结果,但可能它也在使用
ToString
来显示值,你在哪里写的?“编译器”、“粘贴的”和“执行的”等词直到那个注释才出现。阅读你的问题:这并不能解释你想做什么。谢谢你的回答,只是看看里面,我学到了很多,但不幸的是,这对我没有帮助,因为这让我回到了起点。你看,在VisitMethodCall中,我仍然没有静态方法的全名,我的意思是:当我调用
Phone.Parse
时,类
Phone
不在节点属性中。我将获得一个方法信息,该方法名为
Parse
,但类型将是返回类型。@末日之战请查看
MethodInfo
DeclaringType
。谢谢@svick,找到了它。我认为应该在答案中加上它