2016-05-25 3 views
2

Как отключить диалоговое окно предварительного просмотра, которое появляется после лампочки в проекте C#?Исправление кода анализатора Roslyn - Отключить предварительный просмотр

Проблема, которая у меня есть, RegisterCodeFixesAsync делает вызов в базу данных и увеличивает идентификатор, и это делается дважды (один раз во время предварительного просмотра и второй раз, когда действие вызывается) вместо того, чтобы увеличивать только один раз, id увеличивается в два раза

+0

Фактически он увеличивается с шагом 3 раза, но как только я отключу предварительный просмотр, я должен быть в состоянии развернуть дальше. Любая помощь приветствуется. – Lander

+0

Не можете ли вы реорганизовать свой код, чтобы делать только приращение DB при выполнении команды «CodeAction»? – Tamas

+0

у меня есть это в регистре codefix асинхронной context.RegisterCodeFix ( CodeAction.Create ( название: название, createChangedDocument: с => createItemInDB (context.Document, декларация, с), equivalenceKey: название), диагностики); – Lander

ответ

6

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); 
    } 
} 

Эта версия полностью отключает предварительный просмотр. Другой вариант - сделать предварительный просмотр другим путем, например. запрашивая базу данных для следующего значения, но не обновляя ее.

+0

Привет @svick Большое спасибо за ваш ответ. Это в значительной степени объясняет и устраняет мою проблему. Очень признателен – Lander

Смежные вопросы