2016-08-12 83 views
2

我想使用Roslyn重写器,但是我无法通过表达式替换IdentifierName。Roslyn:如何用表达式替换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

ReplaceNode()返回类型相同的this参数,所以确保ReplaceNode()没有抛出,将其转换为SyntaxNode

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

虽然你的情况,ReplaceNode()是没有必要的完全可以返回新的表达式:

return newExpr; 

o f只有当IdentifierNameSyntax实际上可以用给定的表达式替换时,上述选项才会起作用。例如,替换foo();中的所有IdentfierName s将以几乎任何表达式工作,例如,使用bar()结果为bar()();。但对var x = foo();执行相同操作将不起作用,因为bar() x = bar()();在语法上不是有效的。

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

而且,这样做可以让你与缺少必需的空白,例如使用barvar x = foo();结果有效的树,而是一个无效的文字表述:barx = bar();。所以不要忘记在之后格式化结果树。