C# Roslyn:如何用表达式替换标识符名称

C# Roslyn:如何用表达式替换标识符名称,c#,roslyn,C#,Roslyn,我正在尝试使用Roslyn重写器,但我无法用表达式替换IdentifierName 据我所知,当访问者进行此类替换时,他们需要匹配类型。是否存在忽略类型进行此替换的变通方法 public class NameRewriter : CSharpSyntaxRewriter { private readonly ExpressionSyntax newExpr; public NameRewriter(ExpressionSyntax newExpr) { this

我正在尝试使用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);
  }

}

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()。因此,不要忘记在之后格式化生成的树