visual-studio - 我可以使用 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 对象进行所有更改。
解决方案
您不能将类型添加到类型UsingDirectiveSyntax
列表中MemberDeclarationSyntax
将插入语句更改为此,它将起作用:
RoslynEditor.InsertBefore(compilationUnit.Usings.First(), usingSmnt);
推荐阅读
- python-3.x - 在 Python 中重复相同的代码块
- amazon-athena - 汇总动态列的值并在新列中应用公式
- c# - Entity Framework 6 Core - 多列引用
- algorithm - 这两种算法分析方式哪一种是对的?它们之间有什么区别?
- java - Java Spring Boot连接池重新启动时无法重新连接到数据库
- c - 如何使用扩展宏创建一个复制头文件的新文件
- reactjs - ReactJS 使用路径导入 SVG
- react-native - 如何将 Youtube 视频与通过 Spotify 播放的歌曲匹配
- r - 基于两个因素的列中的平均值
- python - Discord.Py 更改进入的频道消息