Шаблон 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}
Ответы
Ответ 1
Это живой шаблон, который я придумал, я назначил "npp", чтобы начать его. Я не думаю, что вы можете Ctrl-Shift-R и заменить его, но вы можете удалить строку объявления старого свойства и ввести "npp" для вызова шаблона.
private $TYPE$ $NAME1$;
public $TYPE$ $NAME2$
{
get
{
return $NAME1$;
}
set
{
if ($NAME1$ == value) return;
$NAME1$ = value;
RaisePropertyChanged(() => $NAME1$);
}
}
Ответ 2
Если вы хотите, чтобы это как проверка кода и быстрое исправление, вы можете создать шаблон структурной замены. Перейдите в ReSharper > Параметры > Проверка кодa > Пользовательские шаблоны, нажмите "Добавить шаблон" и введите следующее:
Схема поиска:
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$);
}
}
}
Установите серьезность шаблона на определенный уровень серьезности, который влияет на то, как ReSharper выделяет совпадения в текстовом редакторе.
Необязательно, введите описание для обоих шаблонов, чтобы описание шаблона поиска фокусировалось на проблеме (т.е. "Это регулярное свойство является подозрительным" ) и заменяет описание шаблона на решение проблемы (т.е. "Заменить с помощью реализации INotifyPropertyChanged" )
Нажмите "Добавить", и вы должны сделать это.
Теперь с этим подходом возникают две проблемы:
- У вас нет возможности влиять на оболочку $name $placeholder - после развертывания ReSharper, скорее всего, покрасит новое свойство с помощью "непоследовательных имен" во всех случаях
- Это не работает на моей машине:) Исходное свойство подсвечивается, существует быстрое исправление для шаблона замены, но оно просто не применяется. Мне нужен сон или файл с сообщением об ошибке. Обновление: решил, что мне нужны оба. Здесь отчет об ошибке
Ответ 3
Я создал несколько другой настраиваемый шаблон (ReSharper > Options > Code Inspection > Custom Patterns)
Схема поиска:
public $Type$ $Pname$
{
get { return $FName$; }
set { $FName$ = value; }
}
Заменить шаблон:
public $Type$ $Pname$
{
get { return $FName$; }
set { $FName$ = value; NotifyOnPropertyChanged(() => $Pname$); }
}
И мой рабочий процесс следующий для уже созданных автоматических свойств:
- Alt + Введите имя свойства → В свойство с полем поддержки
- Alt + Введите имя свойства → примените свой настраиваемый шаблон
Это не лучшее решение, но оно работает для меня.
Ответ 4
Еще одна возможность с двумя параметрами, использующими макрос для нижнего индекса первой буквы частной переменной:
public $PropertyType$ $PropertyName$
{
get { return _$variableName$; }
set
{
if (_$variableName$ != value)
{
_$variableName$ = value;
RaisePropertyChanged(() => $PropertyName$);
}
}
}
- Resharper > Проводник шаблонов > Новый шаблон (значок)
- Вставьте фрагмент кода.
- Нажмите "Выбрать макрос" для переменной "variableName"
- Выберите "Значение другой переменной с первым символом в нижнем"
- (Необязательно) Установите для параметра "Не редактируемые", если вы используете "ALT + ENTER" для создания поля с R # (поле будет создано рядом с вашими другими полями. Это позволит избежать копирования/вставки)
Вот скриншот финальной R # Tempate:
![RaisePropertyChanged Resharper Template]()
Ответ 5
У Resharper 7+ теперь есть встроенный.