在C# Roslyn分析器中,能否检测指定Diagnostic是否启用以跳过昂贵检测?
在多诊断Roslyn分析器中按需跳过高开销检测
当然可以在支持多诊断的分析器内部实现这个逻辑,核心是通过分析上下文提供的配置选项判断特定诊断的启用状态:
具体实现步骤:
- 在分析方法(比如
SyntaxNodeAction、CompilationAction这类回调)中,从当前AnalysisContext获取AnalyzerOptions - 调用
ConfigOptions.IsDiagnosticEnabled()方法,传入你要检查的目标DiagnosticDescriptor - 如果返回
false,直接跳过后续高开销的检测代码
- 在分析方法(比如
示例代码片段:
public override void Initialize(AnalysisContext context) { context.EnableConcurrentExecution(); context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); // 注册针对方法声明的分析回调 context.RegisterSyntaxNodeAction(ctx => { // 获取配置选项并检查目标诊断是否禁用 var configOptions = ctx.Options.ConfigOptions; if (!configOptions.IsDiagnosticEnabled(MyHighCostDiagnostic)) { return; // 直接跳过高开销逻辑 } // 这里执行你的高开销模式检测和Diagnostic生成逻辑 // ... }, SyntaxKind.MethodDeclaration); }
- 额外说明:
- 这个方式能识别所有常见的禁用配置:ruleset文件、项目属性里的NOWARN、.editorconfig中的设置,甚至是全局级别的配置
- 不需要拆分分析器类,同一个多诊断分析器里可以为不同诊断单独做状态检查
- 要确保传入的
DiagnosticDescriptor是你定义的对应诊断实例,ID必须完全匹配,否则会判断错误
内容的提问来源于stack exchange,提问作者Orion Edwards
相关产品推荐
相关产品推荐

