【问题标题】:Using Roslyn how do I update the class using directives?使用 Roslyn 如何使用指令更新类?
【发布时间】:2013-06-26 05:53:47
【问题描述】:

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

我想更新班级顶部的 using 指令以包含附加语句,例如:

using System;

public class Foo {

}

应该变成:

using System;
using Custom.Bar;

public class Foo {

}

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

谢谢。

编辑:

我找到了这个属性,但是不知道怎么修改。

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

var compilationUnitSyntax = (CompilationUnitSyntax) (tree);

if (compilationUnitSyntax != null)
      compilationUnitSyntax.Usings.Add();

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

【问题讨论】:

  • 谢谢,已相应更新。

标签: c# roslyn


【解决方案1】:

要创建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 变量。

【讨论】:

  • 对于创建像QualifiedNameSyntax 这样的东西,有时使用 Syntax.ParseName 比直接构建所有部分更容易。
  • 我不明白为什么有 3 种方法可以给人一种可以向对象添加东西的印象。 (cus.Usings.Add() cus.AddUsings() cus.WithUsings()) 并且其中只有一个实际上暗示该对象是不可变的..
  • 我不知道NormalizeWhitespace()!谢谢!
  • Syntax 应替换为 SyntaxFactory
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多