我正在尝试使用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);
}
}
答案 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();
。所以不要忘记之后格式化结果树。