Roslyn Fix Provider 检查修复是否来自预览 Window

Roslyn Fix Provider Check if Fix is From Preview Window

我编写了一个添加成员元素 resx 文件的修复程序。我注意到当 visual studio 生成预期的更改时,它会调用将资源键添加到文件的方法。

我正在注册我的 FixProvider 我正在寻找一种方法来判断修复是否是从预览中调用的

public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
    var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);

    // TODO: Replace the following code with your own analysis, generating a CodeAction for each fix to suggest
    var diagnostic = context.Diagnostics.First();
    var diagnosticSpan = diagnostic.Location.SourceSpan;

    // Find the type declaration identified by the diagnostic.
    var declaration = root.FindToken(diagnosticSpan.Start).Parent.AncestorsAndSelf().OfType<LocalDeclarationStatementSyntax>().First();

    // Register a code action that will invoke the fix.
    context.RegisterCodeFix(
        CodeAction.Create(
            title: title,
            createChangedDocument: c => this.MakeConstAsync(context.Document, declaration, c),
            equivalenceKey: title),
        diagnostic);
}

我如何判断代码修复是否来自旨在修复代码而不仅仅是生成预览的操作,我假设有一种方法可以通过 CodeFixContext,如果不是调用堆栈也可以工作?

这不安全,没有经过全面测试,但可以使用。因此,您可以自行承担使用风险。您可以检查调用堆栈以查看是否正在从预览中调用路径 window:

public static bool IsCallFinal()
{
    var currentStack = new StackTrace();
    return false == currentStack.GetFrames()
              .Any(x => x.GetMethod().Name == "<GetPreviewOperationsAsync>b__0");
}