我可以使用Roslyn DocumentEditor添加UsingStatement吗

时间:2019-02-10 13:35:12

标签: visual-studio roslyn

我的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对象进行所有更改。

1 个答案:

答案 0 :(得分:1)

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

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

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