Resharper найти шаблон и заменить - как вставить строки

У нас есть метод проверки работоспособности

void IsNotNull<T>(T obj){...}

призыв

IsNotNull(obj); 

Я хочу заменить это, чтобы вызвать другую перегрузку, которая принимает второй параметр строки типа (сообщение)

void IsNotNull<T>(T obj, string message){...}

Итак, я хочу изменить вызов как

IsNotNull(obj, "obj is null");

Я пытаюсь добиться этого, используя шаблон поиска и замены resharper.

Итак, мой шаблон поиска: IsNotNull($args$) - это отлично работает и находит вызовы методов

Заменить шаблон: IsNotNull($args$, "$args$ is null") - это ничего не делает

Я тоже пробовал это IsNotNull($args$, """" + $args$ + """")

--Отредактировано-- Окно предложения показывает правильную формулировку (как для аргумента, так и для идентификатора), но после применения оно отличается. Я использую Решарпер 6

введите здесь описание изображения

После применения предложения я получаю это введите описание изображения здесь

Когда я нажимаю «Редактировать шаблон», введите здесь описание изображения


person Nasmi Sabeer    schedule 31.12.2012    source источник
comment
Какой R# вы используете? Я пробовал версию, предложенную @hmemcpy, и все работало нормально. R# 7.1   -  person Ilya Ivanov    schedule 06.01.2013


Ответы (3)


Какой у вас параметр $args$ определен как в поиске и замене? Если вы сделаете это Identifier, то замена должна работать:

Найти: IsNotNull($args$), где $args$ – это Identifier
Заменить: IsNotNull($args$, "$args$ is null")

Вы должны получить желаемый результат, то есть IsNotNull(obj, "obj is null").

person Igal Tabachnik    schedule 31.12.2012
comment
спасибо, к сожалению, это не решило проблему, оно по-прежнему печатает IsNotNull (obj, obj). Я хочу, чтобы мой второй параметр был заключен в двойные кавычки - person Nasmi Sabeer; 31.12.2012
comment
где $args$ — это идентификатор, важная часть. - person Chris Doggett; 02.01.2013

Вы можете попробовать использовать этот шаблон:

IsNotNull($args$, string.Format("{0} is null", $args$))

У меня отлично работает с ReSharper 7.1.

Кажется, что R# не хочет нормально оценивать выражение аргумента внутри строковых литералов. Учитывая ваш шаблон

IsNotNull($args$, "$args$ is null")

Он заменил IsNotNull(5); на IsNotNull(5, 5);, что странно.

person Ilya Ivanov    schedule 31.12.2012
comment
В этом случае мне нужно имя аргументов, а не значение аргументов как args.ToString(). Мне в основном нужно заключить мои аргументы в двойные кавычки - person Nasmi Sabeer; 31.12.2012
comment
Ясно, извините за непонимание, потому что раньше я трассировал значения параметров, а не имена аргументов. Я постараюсь посмотреть, смогу ли я изменить решение в соответствии с вашими потребностями. - person Ilya Ivanov; 31.12.2012

Самый простой способ — переписать исходный метод следующим образом:

void IsNotNull<T>(T obj){
    IsNotNull(obj, "obj is null");
}

Затем щелкните сигнатуру метода и выберите Refactor->Inline Method (Ctrl+R, Ctrl+I). Если вам нужно сохранить исходную сигнатуру метода, вы можете или можете установить флажок «Удалить объявление встроенного метода».

РЕДАКТИРОВАТЬ: похоже, что решение hmemcpy работает в 7.1, поэтому я бы предложил обновление. Однако, если это невозможно, попробуйте следующий поиск и замену регулярных выражений в Visual Studio.

Find: IsNotNull\(([^\),]+)\);
Replace: IsNotNull($1, "$1 is null");

Убедитесь, что установлен флажок «Использовать регулярные выражения», а «Искать в:» должно быть «Все решение».

person Chris Doggett    schedule 02.01.2013
comment
Спасибо за ответ, но ваше предложение не решает мою проблему в контексте Resharper-Replacement-Pattern или вообще. Я хочу, чтобы отображалось конкретное сообщение. Не просто «obj is null», в моем вопросе это был просто пример - person Nasmi Sabeer; 02.01.2013
comment
@NasmiSabeer: Нет проблем. На самом деле, только что понял это и обновляю свое решение. - person Chris Doggett; 02.01.2013
comment
@NasmiSabeer: На самом деле, похоже, что решение hmemcpy верное. Ключевым моментом является то, что $args$ должен быть определен как идентификатор в диалоговом окне «Поиск по шаблону», а не как аргумент. Я не уверен, почему у них есть ограничение кавычек для заполнителей аргументов, но заполнители идентификаторов, похоже, работают нормально. - person Chris Doggett; 02.01.2013
comment
Можете ли вы привести пример, на котором это не сработало, и какую версию Resharper вы используете? Кажется, он работает правильно в моей системе. - person Chris Doggett; 02.01.2013
comment
Спасибо. Можете ли вы показать, что появляется, если вы нажмете ссылку «Редактировать шаблон»? - person Chris Doggett; 02.01.2013
comment
Пожалуйста, прикрепите мое изображение к вопросу - person Nasmi Sabeer; 02.01.2013
comment
Странный. Я использовал точно такие же настройки, и он отлично работает с Identifier. Единственная разница, которую я вижу, это то, что вы используете ReSharper 6, а я использую 7.1.1. Возможно, они что-то переделали за это время. Можете ли вы попробовать 30-дневную демоверсию 7.1 и посмотреть, работает ли она с ней? - person Chris Doggett; 02.01.2013
comment
Извините за задержку, Крис, мне потребовалось некоторое время, чтобы найти запасной компьютер с Resharper 7. Спасибо, это действительно сработало. - person Nasmi Sabeer; 09.01.2013