是否存在可从C#源代码生成源生成器用SyntaxFactory语句的工具?
问题解答
可用工具说明
这类工具是存在的,目前主流的两类实现完全可以满足你的需求:
- 第一类是Roslyn官方团队推出的配套工具,你可以直接在Visual Studio的扩展市场搜索安装
Syntax Factory Generator相关扩展,安装完成后只要在编辑器里选中你写好的样板C#代码,右键即可生成对应的SyntaxFactory构造代码,直接复制就能用到你的源生成器项目里。 - 第二类是轻量的本地实现工具,你完全可以自己基于Roslyn封装一个百行左右的小工具:
- 先调用
CSharpSyntaxTree.ParseText()解析你写的样板代码,得到语法树根节点 - 实现一个
CSharpSyntaxVisitor<string>,遍历每个语法节点的时候输出对应节点的SyntaxFactory构造方法调用代码,嵌套的子节点作为参数传入即可 - 对于特性、修饰符、 trivia(空格、换行、注释这类节点)也可以在访问器里做对应的生成逻辑,也可以根据需要决定是否保留格式相关的trivia
- 先调用
优化建议
如果你不想自己实现完整访问器,可以参考以下技巧简化手动构造的工作量:
- 不需要手动拼接所有细节节点,生成的代码如果不需要保留特定格式,可以直接调用
SyntaxFactory.ParseStatement()、SyntaxFactory.ParseExpression()这类方法直接从文本生成对应语法节点,比手动一层层构造SyntaxFactory调用简单很多 - 对于重复出现的代码结构,可以封装静态帮助方法生成,避免重复写重复的SyntaxFactory调用序列
- 调试的时候可以用
ToFullString()方法输出你构造的语法节点的实际代码,快速校验生成逻辑是否符合预期
注:如果使用第三方扩展的话,要注意扩展版本和你项目中引用的Microsoft.CodeAnalysis.CSharp版本匹配,避免生成的调用代码存在API不兼容的问题。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

