我可以使用 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);
我的 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);