Roslyn分析器代码修复 - 禁用预览选项

3

如何禁用C#项目中灯泡后出现的预览对话框?

我的问题是,RegisterCodeFixesAsync调用数据库并增加id,但这会发生两次(一次在预览时,第二次在操作被调用时),而不是只增加一次,导致id增加了两次。


实际上它被递增了3次,但一旦我禁用预览,我应该能够进一步深入。任何帮助都将不胜感激。 - Lander
你不能重构你的代码,只有在执行“CodeAction”时才进行数据库增量操作吗? - Tamas
我在寄存器代码中有这个修复异步上下文。context.RegisterCodeFix( CodeAction.Create( title: title, createChangedDocument: c => createItemInDB(context.Document, declaration, c), equivalenceKey: title), diagnostic); - Lander
1个回答

9

CodeAction有单独的ComputePreviewOperationsAsync()ComputeOperationsAsync()方法。它们返回不同的值是我认为你所需要的。但如果你使用通用的调用CodeAction.Create()的方法,两个方法将返回相同的值。

相反你可以创建一个自定义类,该类继承CodeAction并按你想要的方式重写方法。例如:

class NoPreviewCodeAction : CodeAction
{
    private readonly Func<CancellationToken, Task<Solution>> createChangedSolution;

    public override string Title { get; }

    public override string EquivalenceKey { get; }

    public NoPreviewCodeAction(
        string title, Func<CancellationToken, Task<Solution>> createChangedSolution,
        string equivalenceKey = null)
    {
        this.createChangedSolution = createChangedSolution;

        Title = title;
        EquivalenceKey = equivalenceKey;
    }

    protected override Task<IEnumerable<CodeActionOperation>> ComputePreviewOperationsAsync(
        CancellationToken cancellationToken)
    {
        return Task.FromResult(Enumerable.Empty<CodeActionOperation>());
    }

    protected override Task<Solution> GetChangedSolutionAsync(
        CancellationToken cancellationToken)
    {
        return createChangedSolution(cancellationToken);
    }
}

这个版本完全禁用了预览功能。另一个选项是使预览走不同的路径,例如查询数据库获取下一个值,但不进行更新。

嗨@svick,非常感谢您的回答。那基本上解释并解决了我的问题。非常感谢。 - Lander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接