如何执行依赖内部接口的Roslyn代码修复器?
问题解答
1. 依赖内部接口的修复器能否复用
依赖IPickMembersService这类内部接口的修复器,没法直接复用官方实现。Roslyn把这类涉及用户交互的服务设为内部接口,本质就是明确不对外提供扩展支持——这类修复器的设计仅适配官方IDE(比如Visual Studio)的内部服务生态,第三方IDE没有实现这些内部接口的权限和上下文。
你目前的处理方式没有问题,不是操作失误,而是这类修复器本身就不具备跨IDE复用的设计前提。
2. 快速判断修复器可用性的方法
可以从两个核心维度判断:
- 检查依赖类型的访问修饰符:查看修复器生成的
CodeAction是否依赖internal修饰的类型/接口。如果是,要么能通过反射绕过(比如你处理CodeActionWithNestedActions的方式),要么完全无法复用(像IPickMembersService这种需要实现内部接口的情况)。 - 区分修复器的交互类型:
- 无用户交互的修复器(比如添加缺失
using、移除未引用变量):基本都能复用,哪怕依赖少量内部类型,反射大多能解决。 - 需用户输入的修复器(比如选择成员生成Equals、重构时选作用范围):这类几乎都绑定官方内部UI服务,第三方IDE无法直接对接,要么自己实现替代逻辑,要么暂时放弃支持。
- 无用户交互的修复器(比如添加缺失
3. 可选替代方案(针对带交互的修复器)
如果一定要支持这类修复器,只能脱离官方实现,自己造轮子:
- 针对
GenerateEqualsAndGetHashCodeFromMembers这类场景,自己开发选成员的UI组件 - 用Roslyn的
SyntaxGenerator等公开API手动实现代码生成逻辑 - 将自定义的代码变更封装成
CodeAction,集成到你的IDE中
内容的提问来源于stack exchange,提问作者anakic
相关产品推荐
相关产品推荐

