首页 > 解决方案 > 我可以使用 Roslyn DocumentEditor 添加 UsingStatement

问题描述

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

其中一项更改可能是插入 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 强制转换为 MemberDeclarationSyntax)

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

标签: visual-studioroslyn

解决方案


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

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

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

推荐阅读