2016-08-12 82 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();。所以不要忘記在之後格式化結果樹。