Visual studio 我可以使用Roslyn文档编辑器添加UsingStatement吗
我的Visual Studio扩展需要对源代码文件进行多次更新。使用DocumentEditor(Microsoft.CodeAnalysis.Editing.DocumentEditor)类似乎是推荐的方法 更改之一可能是插入using语句 我可以使用以下代码生成UsingStatementSyntax:Visual studio 我可以使用Roslyn文档编辑器添加UsingStatement吗,visual-studio,roslyn,Visual Studio,Roslyn,我的Visual Studio扩展需要对源代码文件进行多次更新。使用DocumentEditor(Microsoft.CodeAnalysis.Editing.DocumentEditor)类似乎是推荐的方法 更改之一可能是插入using语句 我可以使用以下代码生成UsingStatementSyntax: public UsingDirectiveSyntax UsingStatement ( string namespaceName ) { var qualifiedName = Sy
public UsingDirectiveSyntax UsingStatement ( string namespaceName )
{
var qualifiedName = SyntaxFactory.ParseName ( namespaceName ) ;
var usingSmnt = SyntaxFactory.UsingDirective ( qualifiedName ) ;
return usingSmnt ;
}
我试图做的是从Document对象获取CompliationUnitSyntax
var Tree = await RoslynDoc.GetSyntaxTreeAsync() ;
var Root = Tree.GetRoot() ;
var cus = Root as CompilationUnitSyntax ;
并使用InsertBefore()添加Using语句
此时,它不会生成错误,但当我最终在DocumentEditor上调用GetChangedDocument()方法时,它会导致InvalidCastException(无法使用DirectiveSyntax强制转换为MemberDeclarationSyntax)
我知道我可以使用AddUsings()方法将UsingDirectiveSyntax添加到CompilationUnitSyntax,但如果可能,我更愿意通过DocumentEditor对象进行所有更改。您不能将
UsingDirectiveSyntax
类型添加到MemberDeclarationSyntax
类型的列表中
将insert语句更改为此,它将工作:
RoslynEditor.InsertBefore(compilationUnit.Usings.First(), usingSmnt);
你好,杜迪,谢谢你的回答,通常效果很好。但是,如果Usings列表为空,则会失败。如果列表是空的,我该怎么办?我也在做一些需要使用语句添加的事情,我遇到了同样的问题,如果没有,它就会失败。我设法找到了一个适用于这两种情况的解决方案:
var updatedcomilationunit=compilationUnit.AddUsings(usingStatement);ReplaceNode(compileUnit,updatedCompileUnit)代码>希望这有帮助!
RoslynEditor.InsertBefore(compilationUnit.Usings.First(), usingSmnt);