使用Roslyn如何使用指令更新类

本文关键字:更新 指令 何使用 Roslyn 使用 | 更新日期: 2023-09-27 18:19:51

刚刚发现Roslyn,请耐心等待。

我想更新类顶部的using指令,以包含一个额外的语句,例如:

using System;
public class Foo {
}

应该变成:

using System;
using Custom.Bar;
public class Foo {
}

我看到我可以重写SyntaxRewriter,并且我这样做是为了处理方法级别的代码,但我看不到可以使用指令访问这些代码的重写?

谢谢。

编辑:

我找到了这个属性,但我不知道如何修改它。

var tree = document.GetSyntaxTree().GetRoot() as SyntaxNode;
var compilationUnitSyntax = (CompilationUnitSyntax) (tree);
if (compilationUnitSyntax != null)
      compilationUnitSyntax.Usings.Add();

不幸的是UsingDirectiveSyntax是内部的,所以我如何添加一个!:D

使用Roslyn如何使用指令更新类

要创建SyntaxNodes,您必须使用Syntax类工厂方法(在您的情况下是Syntax.UsingDirective方法)。

你可以用AddUsings方法添加一个新的用法,比如

if (compilationUnitSyntax != null)
{
    var name = Syntax.QualifiedName(Syntax.IdentifierName("Custom"),
                                    Syntax.IdentifierName("Bar"));
    compilationUnitSyntax = compilationUnitSyntax
        .AddUsings(Syntax.UsingDirective(name).NormalizeWhitespace());
}

注意:由于CompilationUnitSyntax的不变性,您需要将AddUsings调用的结果重新分配给compilationUnitSyntax变量。