Подтвердить что ты не робот

Шаблон 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}
4b9b3361

Ответ 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