Как извлечь содержимое строки в шаблоне ReSharper?

У меня есть следующая проблема:

Я хочу заменить жестко закодированную строку, которая содержит имя свойства, на выражение члена LINQ

// like this:
NotifyOfPropertyChange("MyProperty");
// becomes
NotifyOfPropertyChange(() => MyProperty);

с шаблоном ReSharper.

Следующие попытки не сработали:

NotifyOfPropertyChange("$prop$"); // ($prop$ is of type Identifier, results in parse error)
NotifyOfPropertyChange($prop$); // ($prop$ is of type Expression [System.String],  
                                // almost works, but without removing the quotes

Шаблон замены всегда был одинаковым:

NotifyOfPropertyChange(() => $prop$);

Есть идеи?

2 ответа

Я не думаю, что вам нужен структурный поиск и замена R# здесь (что повезло, потому что я не думаю, что в текущей версии это может сделать это). Регулярные выражения Найти и Заменить в Visual Studio должны быть достаточно хорошими:

Find What: 
NotifyPropertyChange\("{.*}"\)

( ) сбегают так, что они не становятся группирующей конструкцией; { } помечать все, что соответствует шаблону внутри, чтобы сделать их доступными для выражения замены

Replace with:
NotifyPropertyChange(() => \1)

Все здесь буквально, кроме \1, что означает "первое теговое выражение".

Если я правильно понимаю ваше намерение, то, возможно, это поможет. Некоторое время назад я нашел этот кусок кода (не помню, кто его опубликовал изначально)

public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
    {
        return (propertyExpression.Body as MemberExpression).Member.Name;
    }

Итак, следующее:

NotifyPropertyChange( () => MyProperty)

должен дать результат:

NotifyPropertyChange("MyProperty")
Другие вопросы по тегам