Roslyn:如何用Expression替换IdentifierName

时间:2016-08-12 08:57:31

标签: c# roslyn

我正在尝试使用Roslyn重写器,但我无法通过Expression替换IdentifierName。

根据我的理解,当访问者进行此类替换时,他们需要匹配类型。是否有任何解决方法来执行此替换忽略类型?

public class NameRewriter : CSharpSyntaxRewriter
{
   private readonly ExpressionSyntax newExpr;

   public NameRewriter(ExpressionSyntax newExpr) {
          this.newExpr = newExpr;
   }

  public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax node) {
          return node.ReplaceNode(node, newExpr);
  }

}

1 个答案:

答案 0 :(得分:1)

ReplaceNode()的返回类型与其this参数相同,因此要确保ReplaceNode()不投掷,请将其投放到SyntaxNode

return ((SyntaxNode)node).ReplaceNode(node, newExpr);

虽然在你的情况下,ReplaceNode()根本不需要,但只返回新表达式就足够了:

return newExpr;

只有当IdentifierNameSyntax实际上可以替换为给定的表达式时,上述两个选项才有效。例如,替换IdentfierName中的所有foo();将适用于几乎任何表达式,例如使用bar()会导致bar()();。但对var x = foo();执行相同操作无效,因为bar() x = bar()();在语法上无效。

另一方面,使用像bar这样的东西应该可以随时使用,因为它是另一个IdentifierName

此外,执行此操作可能会使您缺少必需的空格,例如使用bar var x = foo();导致有效树,但文本表示无效的barx = bar();。所以不要忘记之后格式化结果树。