Resharper查找模式并替换 - 如何插入字符串

时间:2012-12-31 13:39:45

标签: c# refactoring resharper automated-refactoring

我们有一个完整性检查方法

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

调用

IsNotNull(obj); 

我想替换它来调用另一个带有第二个类型字符串参数的重载(消息)

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

所以我想将调用更改为

IsNotNull(obj, "obj is null");

我正在尝试使用resharper的find模式来实现这一点并替换。

所以我的查找模式是:IsNotNull($args$) - 这很好用,它找到方法调用

替换模式:IsNotNull($args$, "$args$ is null") - 这没有做任何事情

我也试过这个IsNotNull($args$, """" + $args$ + """")

- Edited-- 建议框显示正确的措辞(对于参数和标识符),但一旦应用它是不同的。我正在使用Resharper 6

enter image description here

在应用建议后,我得到了这个 enter image description here

单击“编辑图案”时 enter image description here

3 个答案:

答案 0 :(得分:7)

您在搜索和替换中定义的$args$参数是什么?如果您将其设为Identifier,则替换应该起作用:

  

查找:IsNotNull($args$) - 其中$args$Identifier   替换:IsNotNull($args$, "$args$ is null")

你应该得到你想要的结果,即IsNotNull(obj, "obj is null")

答案 1 :(得分:1)

您可以考虑尝试使用此模式:

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

ReSharper 7.1对我来说非常适合。

看来,R#通常不想评估字符串文字中的参数表达式。鉴于你的模式

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

它将IsNotNull(5);替换为IsNotNull(5, 5);,这是奇数

答案 2 :(得分:1)

最简单的方法是重写原始方法,如下所示:

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

然后单击方法签名,并选择Refactor-&gt; Inline Method(Ctrl + R,Ctrl + I)。如果您需要保留原始方法签名,您可以,或者您可以选中“删除内联方法声明”框。

编辑:看起来hmemcpy的解决方案适用于7.1,所以我建议升级。但是,如果无法做到这一点,请在Visual Studio中尝试以下正则表达式find-and-replace。

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

确保选中“使用正则表达式”,并且“查找:”应为“整个解决方案”。