Шаблон Resharper для автоматической реализации INotifyPropertyChanged

Можно ли написать шаблон кода или фрагмент, который будет делать следующее:

У меня есть свойство, объявленное так:

public string String1 {get;set;}

И я хочу, чтобы reshaprer автоматически генерировал следующее:

private string _string1;
public string String1
{
    get
    {
        return _string1;
    }

    set
    {

        if (_string1 != value)
        {
            _string1 = value;
            RaisePropertyChanged(() => String1);
        }
    }
}

Просто прочитайте http://koder.wordpress.com/2010/03/25/resharper-inotifypropertychanged/ статью и создали новый живой шаблон, который может вставлять код для нового свойства, как я хочу.

Можно ли настроить этот шаблон таким образом, чтобы он появлялся в меню Alt+Enter как подсказка при наведении курсора на объявление свойства?

Подобно:

{Access modifiers} **{Type} {Name}** {Possible get;set; statements}

5 ответов

Решение

Это живой шаблон, который я придумал, я назначил npp для его запуска. Я не думаю, что вы можете Ctrl-Shift-R и заменить его, но вы можете удалить старую строку объявления свойства и набрать 'npp', чтобы вызвать шаблон.

private $TYPE$ $NAME1$;
public $TYPE$ $NAME2$
{
    get
    {
        return $NAME1$;
    }

    set
    {

        if ($NAME1$ == value) return;

        $NAME1$ = value;
        RaisePropertyChanged(() => $NAME1$);
    }
}

Я создал немного другой пользовательский шаблон (ReSharper > Параметры> Проверка кода> Пользовательские шаблоны)

Шаблон поиска:

public $Type$ $Pname$
{
   get { return $FName$; }
   set { $FName$ = value; }
}

Заменить шаблон:

public $Type$ $Pname$
{
    get { return $FName$; }
    set { $FName$ = value; NotifyOnPropertyChanged(() => $Pname$); }
}

И мой рабочий процесс заключается в следующем для уже созданных авто-свойств:

  1. Alt+Enter на имя свойства -> To Property with backing field
  2. Alt+Enter на имя свойства -> применить мой пользовательский шаблон

Это не лучшее решение, но оно работает для меня.

Если вы хотите это как проверка кода и быстрое исправление, вы можете создать шаблон структурной замены. Перейдите в ReSharper > Параметры> Проверка кода> Пользовательские шаблоны, нажмите Добавить шаблон и введите следующее:

Шаблон поиска:

public $type$ $name$ {get;set;}

где $type$ - заполнитель типа типа System.Object или производный, а $name$ - идентификатор заполнителя.

Заменить шаблон:

private string _$name$;
public string $name$
    {
        get
        {
            return _$name$;
        }

        set
        {
            if (_$name$ != value)
            {
                _$name$ = value;
                RaisePropertyChanged(() => $name$);
            }
        }
    }

Установите для параметра Pattern Severity определенный уровень серьезности, который влияет на то, как ReSharper выделяет совпадения в текстовом редакторе. При желании введите описание для обоих шаблонов, чтобы описание шаблона поиска было сосредоточено на проблеме (т. Е. "Это обычное свойство является подозрительным"), а описание замены шаблона нацелено на решение проблемы (т. Е. "Замените реализацией INotifyPropertyChanged"). быть сделано

Теперь с этим подходом связаны две проблемы:

  1. У вас нет возможности повлиять на регистр $name$ placeholder - после развертывания ReSharper, скорее всего, закрасит новое свойство с помощью проверок на "непоследовательное присвоение имен" во всем.
  2. Это не работает на моей машине:) Исходное свойство выделено, быстрое исправление для шаблона замены есть, но оно просто не применяется. Мне либо нужно поспать, либо подать отчет об ошибке. Обновление: решил, что мне нужны оба. Вот отчет об ошибке

Еще одна возможность с двумя параметрами, которые используют макрос для нижнего регистра первой буквы приватной переменной:

public $PropertyType$ $PropertyName$
{
    get { return _$variableName$; }

    set
    {
        if (_$variableName$ != value)
        {
            _$variableName$ = value;
            RaisePropertyChanged(() => $PropertyName$);
        }
    }
}
  1. Resharper> Обозреватель шаблонов> Новый шаблон (иконка)
  2. Вставьте фрагмент кода.
  3. Нажмите кнопку Выбрать макрос для переменной "variableName"
  4. Выберите "Значение другой переменной с первым символом ниже"
  5. (Необязательно) Установите значение "Недоступно для редактирования", если вы используете "ALT + ENTER" для создания поля с помощью R# (поле будет создано рядом с другими вашими полями. Это позволяет избежать копирования / вставки)

Вот скриншот финального R# Tempate:RaisePropertyChanged Resharper Шаблон

Resharper 7+ теперь имеет это встроенное.

Другие вопросы по тегам