我可以使用 Roslyn DocumentEditor 添加 UsingStatement

Can I add a UsingStatement using a Roslyn DocumentEditor

我的 Visual Studio 扩展需要对源代码文件进行多次更新。使用 DocumentEditor (Microsoft.CodeAnalysis.Editing.DocumentEditor) class 似乎是推荐的方法。

其中一项更改可能是插入 using 语句。

我可以使用以下代码生成 UsingStatementSyntax:

public UsingDirectiveSyntax UsingStatement ( string  namespaceName )
{
  var qualifiedName = SyntaxFactory.ParseName ( namespaceName ) ;
  var usingSmnt     = SyntaxFactory.UsingDirective ( qualifiedName ) ;
  return usingSmnt ;
}

我尝试做的是从 Document 对象中获取 CompilationUnitSyntax ...

  var Tree      = await RoslynDoc.GetSyntaxTreeAsync() ;
  var Root      = Tree.GetRoot() ;
  var cus       = Root as CompilationUnitSyntax ;

并使用 InsertBefore()

添加 Using 语句
  var usingSmnt = UsingStatement ( namespaceName ) ;
  RoslynEditor.InsertBefore ( cus.Members.First(), usingSmnt ) ;

此时,它不会产生错误,但是当我最终在 DocumentEditor 上调用 GetChangedDocument() 方法时,它会导致 InvalidCastException(无法将 UsingDirectiveSyntax 转换为成员声明语法)

我知道我可以使用 AddUsings() 方法将 UsingDirectiveSyntax 添加到 CompilationUnitSyntax,但如果可能的话,我更愿意通过 DocumentEditor 对象进行所有更改。

您不能将 UsingDirectiveSyntax 类型添加到 MemberDeclarationSyntax 类型的列表中

将插入语句更改为此,它会起作用:

RoslynEditor.InsertBefore(compilationUnit.Usings.First(), usingSmnt);