10

我们有一个健全的检查方法

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$ + """")

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

在此处输入图像描述

应用建议后,我得到了这个 在此处输入图像描述

当我单击编辑模式时 在此处输入图像描述

4

3 回答 3

7

$args$在搜索和替换中定义的参数是什么?如果你做到了Identifier,那么你替换应该工作:

查找:IsNotNull($args$)- 替换在$args$哪里:Identifier
IsNotNull($args$, "$args$ is null")

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

于 2012-12-31T14:55:40.907 回答
1

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

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

ReSharper 7.1 非常适合我。

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

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

取而代之IsNotNull(5);IsNotNull(5, 5);是奇怪的

于 2012-12-31T14:10:45.377 回答
1

最简单的方法是像这样重写原始方法:

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");

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

于 2013-01-02T16:40:54.223 回答