Шаблон 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$); }
}
И мой рабочий процесс заключается в следующем для уже созданных авто-свойств:
- Alt+Enter на имя свойства -> To Property with backing field
- 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"). быть сделано
Теперь с этим подходом связаны две проблемы:
- У вас нет возможности повлиять на регистр $name$ placeholder - после развертывания ReSharper, скорее всего, закрасит новое свойство с помощью проверок на "непоследовательное присвоение имен" во всем.
- Это не работает на моей машине:) Исходное свойство выделено, быстрое исправление для шаблона замены есть, но оно просто не применяется. Мне либо нужно поспать, либо подать отчет об ошибке. Обновление: решил, что мне нужны оба. Вот отчет об ошибке
Еще одна возможность с двумя параметрами, которые используют макрос для нижнего регистра первой буквы приватной переменной:
public $PropertyType$ $PropertyName$
{
get { return _$variableName$; }
set
{
if (_$variableName$ != value)
{
_$variableName$ = value;
RaisePropertyChanged(() => $PropertyName$);
}
}
}
- Resharper> Обозреватель шаблонов> Новый шаблон (иконка)
- Вставьте фрагмент кода.
- Нажмите кнопку Выбрать макрос для переменной "variableName"
- Выберите "Значение другой переменной с первым символом ниже"
- (Необязательно) Установите значение "Недоступно для редактирования", если вы используете "ALT + ENTER" для создания поля с помощью R# (поле будет создано рядом с другими вашими полями. Это позволяет избежать копирования / вставки)
Вот скриншот финального R# Tempate: