Шаблон Resharper для автоматической реализации INotifyPropertyChanged - PullRequest
13 голосов
/ 03 июля 2011

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

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

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 ]

8 голосов
/ 03 июля 2011

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

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

    set
    {

        if ($NAME1$ == value) return;

        $NAME1$ = value;
        RaisePropertyChanged(() => $NAME1$);
    }
}
5 голосов
/ 15 марта 2014

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

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 Template

5 голосов
/ 20 августа 2011

Я создал немного другой пользовательский шаблон (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 Свойство с полем поддержки
  2. Alt + Enter по свойствуназвание -> применить мой шаблон

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

5 голосов
/ 05 июля 2011

Если вы хотите это как проверка кода и быстрое исправление, вы можете создать шаблон структурной замены.Перейдите в 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. Это не работает на моей машине :) Исходное свойство подсвечивается, быстрое исправление для шаблона замены есть, но оно просто не работаетприменить это.Мне либо нужно поспать, либо подать отчет об ошибке.Обновление: решил, что мне нужны оба.Вот отчет об ошибке
3 голосов
/ 09 января 2013

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

...