Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EditorConfig-如何在自定义分析器中访问EditorConfig规则设置_C#_Roslyn_Visual Studio 2019_Roslyn Code Analysis_Editorconfig - Fatal编程技术网

C# EditorConfig-如何在自定义分析器中访问EditorConfig规则设置

C# EditorConfig-如何在自定义分析器中访问EditorConfig规则设置,c#,roslyn,visual-studio-2019,roslyn-code-analysis,editorconfig,C#,Roslyn,Visual Studio 2019,Roslyn Code Analysis,Editorconfig,我想知道是否有一种本地方式来存储和访问自定义roslyn分析器的附加设置。 假设我有诊断Id为“XA0001”的规则,我将在编辑器配置中进行设置 dotnet_diagnostic.XA0001.severity = error 到目前为止,一切正常。现在,我想添加如下内容来创建新规则的设置: dotnet_diagnostic.XA0001.scope = class, enum, interface dotnet_diagnostic.XA0001.level = toplevel 其中

我想知道是否有一种本地方式来存储和访问自定义roslyn分析器的附加设置。 假设我有诊断Id为“XA0001”的规则,我将在编辑器配置中进行设置

dotnet_diagnostic.XA0001.severity = error
到目前为止,一切正常。现在,我想添加如下内容来创建新规则的设置:

dotnet_diagnostic.XA0001.scope = class, enum, interface
dotnet_diagnostic.XA0001.level = toplevel
其中,scope和level是规则的附加属性,我需要对其进行配置(通常是字符串或某种枚举),因为它们可能会有所不同。每次都会有可由editorconfig覆盖的该规则的默认设置

是否可能,如果可能,是否有任何超短示例ev。链接到如何在analyzer类中或仅从该项目级别访问其他editorconfig设置的帖子

[DiagnosticAnalyzer(LanguageNames.CSharp)]
    public class RuleXA0001Analyzer : DiagnosticAnalyzer
    {
        public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(RuleXA0001.Descriptor);

        public override void Initialize(AnalysisContext context)
        {
            context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
            context.EnableConcurrentExecution();

            //TODO access editorconfig settings for this rule
            //Perform analysis & report diagnostics
        }
    }   
}   
[DiagnosticanAnalyzer(LanguageNames.CSharp)]
公共类RuleXA0001Analyzer:诊断分析器
{
public override ImmutableArray SupportedDiagnostics{get;}=ImmutableArray.Create(RuleXA0001.Descriptor);
公共覆盖无效初始化(AnalysisContext上下文)
{
ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.enableCcurrentExecution();
//TODO访问此规则的编辑器配置设置
//执行分析和报告诊断
}
}   
}   
无需访问其他规则设置,即使它在其他情况下可能有益


感谢AnalyzeZeroOptions类有一个属性
AnalyzerConfigOptionsProvider
,可用于访问.editorconfig设置

例如,如果要分析代码块,可以执行以下操作:

公共覆盖无效初始化(AnalysisContext上下文)
{
RegisterCompilationStartAction(RegisterCompilationStart);
}
专用静态无效注册表CompilationStart(编译StartAnalysisContext startContext)
{
var optionsProvider=startContext.Options.AnalyzerConfigOptionsProvider;
RegisterCodeBlockAction(actionContext=>AnalyzeCodeBlock(actionContext,Options Provider));
}
私有静态无效AnalyzeCodeBlock(CodeBlockAnalysisContext上下文,AnalyzerConfigOptionsProvider选项Provider)
{
//这些选项包含.editorconfig设置
var options=optionsProvider.GetOptions(context.CodeBlock.SyntaxTree);
var isFound=options.TryGetValue(“dotnet_diagnostic.XA0001.level”,输出var值);
}

让我在本周晚些时候检查一下,我最终使用反射访问了这些值,但在构建过程中,反射并不能可靠地提供值,只能在实时分析中提供。这看起来很有希望!值得检查您使用的Microsoft.CodeAnalysis.Common版本(即
AnalyzeZeroOptions
的位置)。我认为
AnalyzerConfigOptionsProvider
属性是内部的,或者是旧版本中的某个属性(在v2.10.0中肯定不可见,这是我一直在使用的),但在最新版本中,它现在是公开的。