我的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对象进行所有更改。
答案 0 :(得分:1)
您不能将UsingDirectiveSyntax
类型添加到MemberDeclarationSyntax
类型的列表中
将insert语句更改为此,它将起作用:
RoslynEditor.InsertBefore(compilationUnit.Usings.First(), usingSmnt);