C# Roslyn:如何用表达式替换标识符名称
我正在尝试使用Roslyn重写器,但我无法用表达式替换IdentifierName 据我所知,当访问者进行此类替换时,他们需要匹配类型。是否存在忽略类型进行此替换的变通方法C# Roslyn:如何用表达式替换标识符名称,c#,roslyn,C#,Roslyn,我正在尝试使用Roslyn重写器,但我无法用表达式替换IdentifierName 据我所知,当访问者进行此类替换时,他们需要匹配类型。是否存在忽略类型进行此替换的变通方法 public class NameRewriter : CSharpSyntaxRewriter { private readonly ExpressionSyntax newExpr; public NameRewriter(ExpressionSyntax newExpr) { this
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);
}
}
ReplaceNode()
的返回类型与其this
参数相同,因此要确保ReplaceNode()
不会抛出,请将其强制转换为SyntaxNode
:
return ((SyntaxNode)node).ReplaceNode(node, newExpr);
虽然在您的情况下,ReplaceNode()
完全不是必需的,但只需返回新表达式即可:
return newExpr;
只有当IdentifierNameSyntax
可以实际替换为给定表达式时,上述两个选项才起作用。例如,替换foo()中的所有identifiername
s
几乎可以与任何表达式一起使用,例如,使用bar()
会产生bar()代码>。但是对var x=foo()做同样的操作代码>不起作用,因为bar()x=bar()代码>在语法上无效
另一方面,使用类似于bar
的东西应该可以随时使用,因为它是另一个标识名
此外,这样做可能会丢失所需的空白,例如在var x=foo()上使用bar
代码>生成有效的树,但其中一个具有无效的文本表示形式:barx=bar()代码>。因此,不要忘记在之后格式化生成的树