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

she*_*nku 7 c# roslyn

刚刚发现罗斯林,请耐心等待.

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

using System;

public class Foo {

}
Run Code Online (Sandbox Code Playgroud)

应该成为:

using System;
using Custom.Bar;

public class Foo {

}
Run Code Online (Sandbox Code Playgroud)

我看到我可以覆盖SyntaxRewriter,我已经这样做来解决方法级代码,但我看不到可能让我访问这些使用指令的覆盖?

谢谢.

编辑:

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

var tree = document.GetSyntaxTree().GetRoot() as SyntaxNode;

var compilationUnitSyntax = (CompilationUnitSyntax) (tree);

if (compilationUnitSyntax != null)
      compilationUnitSyntax.Usings.Add();
Run Code Online (Sandbox Code Playgroud)

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

nem*_*esv 15

要创建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());
}
Run Code Online (Sandbox Code Playgroud)

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

  • 为了创建像'QualifiedNameSyntax`这样的东西,有时更容易使用Syntax.ParseName,而不是直接构建所有部分. (3认同)
  • `Syntax` 应替换为 `SyntaxFactory`。 (2认同)